2017-10-18 80 views
0

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

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

我不想把它分成两个不同的expects一个无块,以避免同样的方法的多次调用。

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

回答

1

您可以定义subjectsubject.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电话被memoized,所以它只会被调用一次。

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

+0

...或者只是让它两个测试,而不是一个。如果“主题”不是一个昂贵的(慢)操作,那么这是正常的做法。 –

+0

谢谢!没有想过把它纳入主题。花了一个多小时试图以不同的方式解决它,但它是如此简单... – Gregy

+0

@TomLord当然可以做到这一点,但从这个问题我得到了他想避免它的印象。 – meta