2017-02-23 6 views
2

私は、次のアクションを持っている:コントローラー仕様:(:作成)期待する(コントローラ)が受信.TO実行されてから#createアクションを防ぐ

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 

...私は最初binding.pryコンソール(#createアクションが実際に実行されたことを証明する)表示を持ち、その後、スペックは渡し:

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アクションが実行されないように思われます!これは私が望むものではありません。私はいつものようにそれを実行したい。

私はここで間違っていますか?あなたは本当の方法がsupressedさexpect().to receive()を使用する場合...それはちょうど予想通り何かが呼び出されたかどうかを確認

+0

私はARのコールバックと同じ問題に直面しています。私は答えを得た。ありがとう。 –

答えて

2

...

私たちが望むときに我々は通常、それを使用するテスト何か私たちは答えをコントロールしていない場合や私たちは答えが呼び出された模擬を望む。あなたは何かが呼び出されたかどうかを確認し、またオリジナルを実行したい場合は

、あなたが使用する必要があります。

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

関連する問題