2017-10-18 77 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