2016-10-24 16 views
2

モデルを保存し、バックグラウンドジョブを実行するオブジェクトがあります。一連のメッセージが異なるオブジェクト/クラスに送信されることを確認してください

Class UseCase 
    ... 
    def self.perform 
    @account.save 
    BackgroundJob.perform_later(@account.id) 
    end 
end 

私の仕様では、両方のメッセージが送信されることを別にテストしたいと思います。

私は

it 'saves the account' do 
    expect_any_instance_of(Account).to receive(:save) 
    UseCase.perform(account) 
end 

のようなものから始めて、私はちょうどperformにアカウントを保存されたときに、これはうまく働きました。 しかし、私がバックグラウンドジョブを追加したとき、仕様は今や以後渡されませんCouldn't find Account without an ID

両方のメッセージが送信されることを(RSped 3.5では)個別に確認する方法はありますか。

UPDATE

it 'runs the job' do 
expect(BackgroundJob).to receive(:perform_later).with(instance_of(Fixnum)) 
UseCase.perform(account) 
end 

ので、私はアカウントが正しく保存されていると渡します。私は@accountに 'アカウントが保存されます' は、

def self.perform 
@account.save 
byebug 
BackgroundJob.perform_later(@account.id) 
end 

を検査しようとすると、

は、しかし、私は 'ジョブを実行する' は

(byebug) @account 
#<Account id: nil, full_name: "john doe" ...> 

を取得し、私は

(byebug) @account 
#<Account id: 1, full_name: "john doe" ...> 
を取得します

期待通りに@accounttest doubleになるので、最初の仕様ではジョブはIDを取得できません。

おかげ

+0

'@account.save'が実際に' true'を返すことを確認する仕様がありますか?私は '@accountだと思います。save'はアカウントが無効で、保存されていないので、 'id'が割り当てられていないという意味で' false'を返します。 – spickermann

+0

私はbelive @spickermannが正しいです。私は 'save!'と 'save'の違いを説明する答えを加えました。うまくいけば、これはあなたを助ける –

答えて

0

エラーCouldn't find Account without an IDあなたperformメソッドの内部で持っているコードを考慮し、実際にはかなり便利です。

この問題はコメントに記載されていますが、もう少し詳しく説明します。

あなたはおそらく欲しい@account.save実行すると、定義によりtrue/falseを返すなる(私は@accountActiveRecordオブジェクトであると仮定しています)(see documentation

を使用しているが、それが発生しますので、代わりにsave!を使用することですActiveRecord::RecordInvalidエラーが発生し、前述のエラーが発生するのではなく、実行が停止します。あなたはsave!に変更すると、あなたが失敗する可能性があり、保存ケース(属性が欠落している、など)のためのテストを追加することができます

.idを呼び出そうとしたときの方法にbinding.pryを投げると@accountが何であるかに注意してください)。このようなことがあります

it 'should raise error when trying to save invalid record' do 
    # do something to invalidate @account 
    @account.username = nil 
    expect { UseCase.perform(@account) }.to raise_error(ActiveRecord::RecordInvalid) 
    #confirm that no messages were sent 
end 

希望すると、これはあなたを助けます! GLとあなたに質問がある場合はお知らせください/ rspecの詳細ヘルプ

+0

返信ありがとう。あなたのアカウントが保存されていない、または保存されていることを示唆しているが、「保存」が私の望むものを返さない場合は、実際には分かりません。 – macsig

+0

リンク先のドキュメントをお読みください。 'save'がfalseを返した場合、あなたのレコードはDBに保存されませんでした(したがってidの不足) –

関連する問題