gpt4 book ai didi

ruby-on-rails - 分析 Mongoid 事件生成的 ActiveRecord 对象时,Rspec 测试随机失败

转载 作者:IT老高 更新时间:2023-10-28 12:29:59 26 4
gpt4 key购买 nike

我实现了一个基于 Mongoid 的事件日志机制,将事件保存在 MongoDB 中。

Mongoid 模型 Activity 具有 after_create 事件,这些事件根据记录的事件类型执行不同的任务:(简化示例)

class Activity
include Mongoid::Document

after_create do |activity|
method_name = "after_#{activity.event_type}"
send(method_name) if respond_to? method_name
end

def after_user_did_something
MyItem.create!(:type => :user_did_something)
end
end

测试看起来像这样:

 it 'should hide previous [objects] create a new updated one' do
2.times do
user.log_activity(:user_did_something)
end
items = MyItems.where(:type => :user_did_something)
items.count.should == 2
end
end

有时,测试会在 items.count 为 0 而不是 2 时失败。仅当从命令行运行 rspec spec 时才会发生这种情况仅运行此测试或使用 Guard 运行所有测试时,它永远不会发生。

最佳答案

在典型的 Mongodb 设置中,数据库写入成功返回与可以读取数据之间可能存在延迟。这有两个原因:

  • 为了提高性能,“不安全”写入可以在数据提交到磁盘之前返回。
  • Mongodb 使用副本集,存在复制延迟。通常读取是作为负载平衡的一种形式分发到副本的,因此即使您使用安全写入,您也可能从与您刚刚写入的服务器不同的服务器读取,因此看不到您刚刚写入的数据。<

为确保您始终可以立即回读刚刚使用 Mongoid 写入的数据,您需要设置数据库 session 选项 consistency: :strong, safe: true,这两个选项都不是默认的.

关于ruby-on-rails - 分析 Mongoid 事件生成的 ActiveRecord 对象时,Rspec 测试随机失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22037925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com