2

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

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

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

4

3 回答 3

1

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

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

...

collection2.should_not have(5).items

# etc....

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

have(n).items 匹配器

于 2013-02-08T15:16:22.543 回答
0

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

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

" be_persisted " 是一个谓词匹配器,它只是简单地调用持久化? import_obj 上的方法。该方法“持续存在?” 是 Rails 的方法,如果 import_obj 已保存,则返回 true。

于 2017-10-18T04:05:32.673 回答
-1

不确定 Rspec 是否可以帮助您,但是快速手动访问数据库可能会完成这项工作?

[Model1, Model2].each do |model|
  model.where('updated_at > ?', Time.now - 2.seconds).count.should eq 0
end
于 2013-02-08T10:10:47.983 回答