2017-02-23 30 views
2

我有以下作用:控制器規格:期待(控制器)。爲了接收(:創建)防止#創建動作被執行

def create 
    binding.pry 
    @finding.save 
    respond_with @project, @finding 
end 

當運行下面的測試...

it 'balances the consecutive numbers', focus: true do 
    expect { 
    post :create, params: {...} 
    }.to change { Finding.count }.from(0).to 1 
end 

...我首先顯示出來(證明該#create行動實際上是執行)的binding.pry控制檯,然後規範經過:

Finished in 4.24 seconds (files took 5.31 seconds to load) 
1 example, 0 failures 

現在,當我添加一個expect(controller).to receive(:create) ...

it 'balances the consecutive numbers', focus: true do 
    expect(controller).to receive(:create) # This is new! 

    expect { 
    post :create, params: {...}} 
    }.to change { Finding.count }.from(0).to 1 
end 

...並再次運行測試,我馬上表明瞭該規範失敗的結果:

expected result to have changed from 0 to 1, but did not change 

在拆除change { ... }預期。 ..

it 'balances the consecutive numbers', focus: true do 
    expect(controller).to receive(:create) 

    post :create, params: {project_id: @project.id, finding: {requirement_id: @requirement.id}} 
end 

...它再次經過:

1 example, 0 failures 

但仍然binding.pry#create不叫!

那麼這裏發生了什麼?以某種方式expect(controller).to receive(:create)似乎阻止執行實際的#create行動!這不是我想要的。我希望它一如既往地執行。

我在這裏做錯了什麼?

+0

我面臨同樣的問題,用AR回調。我得到了答案。謝謝。 –

回答

2

當您使用expect().to receive()真正的方法supressed ......它只是驗證是否如預期般的東西被稱爲...

我們通常使用它的時候,我們要測試的東西,如果我們不控制的答案或我們想嘲笑答案被稱爲。

如果你想檢查是否有什麼東西在叫,還跑,原來,你應該使用:

expect(something).to receive(:some_method).and_call_original 

https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/configuring-responses/calling-the-original-implementation