在我的Rails应用程序中,我创建了一个基于JSON数据创建模型层次结构的方法。我想确保该方法不会向数据库保存任何内容。我知道我可以写下测试:
expect {
Importer.import(json)
}.not_to change(Model1, :count)
expect {
Importer.import(json)
}.not_to change(Model2, :count)
# etc.
但我想以更通用的方式做到这一点。 RSpec中是否有方法检查测试期间是否保存了任何模型?
答案 0 :(得分:1)
你做这件事的方式并不算太糟糕,尽管它有点冗长。
您可以使用have
匹配器。
Importer.import(json)
collection1 = Model.all
collection1.should have(5).items
...
collection2.should_not have(5).items
# etc....
虽然,对于您的上下文,阅读它就像您的原始测试更有意义(创建一个真正有意义的自定义匹配器之外)。您测试“进口商”应该做什么或不做什么。
答案 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