RSpec将块匹配器与非块匹配器组合在一起

时间:2017-10-18 16:14:13

标签: ruby rspec

我想检查我的类是否正在创建一个新对象并返回它的实例。我的想法是将change匹配器与be_instance_of匹配器结合使用,但RSpec不允许这样做。

expect { subject.call }.to change { Model.count }.by(1).and be_an_instance_of(Model)

我不想将其拆分为两个不同的expects,其中一个没有阻止,以避免多次调用相同的方法。

这种情况的一般方法是什么?我该如何处理我的案子?

1 个答案:

答案 0 :(得分:1)

您可以将subject定义为subject.call并执行此操作:

specify do
  expect { subject }.to change { Model.count }.by(1)
  expect(subject).to be_an_instance_of(Model)
end

因此,如果以前您的主题是

subject { Foo.new }

制作

subject { Foo.new.call }

letsubject来电会被记忆,所以它只会被调用一次。

只有一个问题:如果第一个期望失败 - 第二个期望不会运行(这是SomethingToAvoidInSpecs™),所以请考虑aggregating failures来解决它。