Rspec 直到创建Mongoid块?

Rspec 直到创建Mongoid块?,rspec,mongoid,Rspec,Mongoid,我正在使用和为带有rspec的API创建测试。Mongoid在生产中不是问题,但在测试API规范时,如: it "renders [person]" do person = FactoryGirl.create(:person) get 'persons' json.count.should eq(1) end 正在创建的模型实例(在本例中为Person)有时在API调用运行时未反映在数据库中,导致如下错误: Failure/Error: json.count.should eq

我正在使用和为带有rspec的API创建测试。Mongoid在生产中不是问题,但在测试API规范时,如:

it "renders [person]" do
  person = FactoryGirl.create(:person)
  get 'persons'
  json.count.should eq(1)
end
正在创建的模型实例(在本例中为
Person
)有时在API调用运行时未反映在数据库中,导致如下错误:

 Failure/Error: json.count.should eq(1)

   expected: 1
        got: 0

   (compared using ==)
如何创建新的数据库条目并阻止规范的进一步执行,直到我知道该条目反映在数据库中?

如下所述:

为了确保您始终可以立即读回您刚刚创建的数据 使用
Mongoid
编写,您需要设置数据库会话选项

consistency: :strong, safe: true
两者都不是默认值

如本文所述:

为了确保您始终可以立即读回您刚刚创建的数据 使用
Mongoid
编写,您需要设置数据库会话选项

consistency: :strong, safe: true
两者都不是默认值

你可以用代替工厂女孩。。。哪个更好/更稳定/可以做各种模型。。。例如我有

这是另一个例子

如果您计划在特定条件下制作模型,如(订阅用户只能创建审阅),则以下制作可以完成

Fabricator(:review) do
  rating         { (1..5).to_a.sample }
  content        { Faker::Lorem.sentence(2) }
  subscription   { Fabricate(:subscription) } # review this subscription
  author         { Fabricate(:user) } # author of the review
  before_create do |review|
    # this insures that the author had already subscribed to the subscription
    # so that the review model doesn't throw validation errors.
    subscription.subscribers.create!(user: author)
  end
end
这是你永远不能用FactoryGirl做的事

底线我已经使用FactoryGirl两个月了,特别是在嵌入文档方面,我遇到了很多问题。。。而且我已经转移到制造业,并且在超过4个月的时间里没有任何问题。。。事实上,它确实对集成测试有很大帮助。

您可以使用它代替factory girl。。。哪个更好/更稳定/可以做各种模型。。。例如我有

这是另一个例子

如果您计划在特定条件下制作模型,如(订阅用户只能创建审阅),则以下制作可以完成

Fabricator(:review) do
  rating         { (1..5).to_a.sample }
  content        { Faker::Lorem.sentence(2) }
  subscription   { Fabricate(:subscription) } # review this subscription
  author         { Fabricate(:user) } # author of the review
  before_create do |review|
    # this insures that the author had already subscribed to the subscription
    # so that the review model doesn't throw validation errors.
    subscription.subscribers.create!(user: author)
  end
end
这是你永远不能用FactoryGirl做的事

底线我已经使用FactoryGirl两个月了,特别是在嵌入文档方面,我遇到了很多问题。。。而且我已经转移到制造业,并且在超过4个月的时间里没有任何问题。。。事实上,它确实对集成测试有很大帮助。

正如我所解释的,Mongodb的Mongoid默认为“最终一致性”模型,因为它提供了更高的性能

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

  • 为了提高性能,在将数据提交到磁盘之前,可能会返回“不安全”写入
  • Mongodb使用副本集,存在复制延迟。通常,读取作为负载平衡的一种形式分发到副本,因此即使使用安全写入,也可能是从与刚写入的服务器不同的服务器读取,因此看不到刚写入的数据
为了确保始终能够立即读回刚刚使用Mongoid编写的数据,需要设置数据库会话选项
一致性::strong,安全性:true
,这两个选项都不是默认选项

正如我所解释的,Mongoid和Mongodb默认为“最终一致性”模型,因为它提供了更高的性能

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

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

为了确保始终能够立即读回刚刚使用Mongoid编写的数据,需要设置数据库会话选项
一致性::strong,安全性:true
,这两个选项都不是默认选项

在mongoid.yml中更改测试环境的配置,如下所示:

test:
  sessions:
    default:
      hosts:
        - localhost
      database: project-test
  options:
      ...
      consistency: :strong
      safe: true
      ...

这样,mongoid将等待mongodb完成操作。

在mongoid.yml中更改测试环境的配置,如下所示:

test:
  sessions:
    default:
      hosts:
        - localhost
      database: project-test
  options:
      ...
      consistency: :strong
      safe: true
      ...

这样,mongoid将等待mongodb完成操作。

您如何知道这是一个时间问题?“如果你耽搁了,它会过去吗?”彼得:是的。
sleep(1)
几乎每次都会让它过去。你怎么知道这是一个时间问题?“如果你耽搁了,它会过去吗?”彼得:是的。睡眠(1)几乎每次都会让它过去