RSpec:检查是否已保存任何型号

时间:2013-02-08 09:49:48

标签: ruby-on-rails database rspec mocking

在我的Rails应用程序中,我创建了一个基于JSON数据创建模型层次结构的方法。我想确保该方法不会向数据库保存任何内容。我知道我可以写下测试:

expect {
  Importer.import(json)
}.not_to change(Model1, :count)
expect {
  Importer.import(json)
}.not_to change(Model2, :count)
# etc.

但我想以更通用的方式做到这一点。 RSpec中是否有方法检查测试期间是否保存了任何模型?

3 个答案:

答案 0 :(得分:1)

你做这件事的方式并不算太糟糕,尽管它有点冗长。 您可以使用have匹配器。

Importer.import(json)
collection1 = Model.all
collection1.should have(5).items

...

collection2.should_not have(5).items

# etc....

虽然,对于您的上下文,阅读它就像您的原始测试更有意义(创建一个真正有意义的自定义匹配器之外)。您测试“进口商”应该做什么或不做什么。

have(n).items matcher

答案 1 :(得分:0)

如果“import”方法可以返回一个Model对象,你可以写下这样的期望:

imported_obj = Importer.import(json)
expect(imported_obj).not_to be_persisted

be_persisted ”是predicate-matcher,它只是在imported_obj上调用持久化?方法。方法“坚持?”是一个Rails方法,如果已保存imported_obj,则返回true。

答案 2 :(得分:-1)

不确定Rspec是否可以帮助您解决此问题,但快速手动访问数据库可能会有所帮助吗?

[Model1, Model2].each do |model|
  model.where('updated_at > ?', Time.now - 2.seconds).count.should eq 0
end