2016-09-16 9 views
0

私は自分の宝石を持っています。だから、私は私の宝石を使ったテストアプリを持っています。私のアプリケーションでは、私の宝石モデルの上にカスタムコールバックを追加するためのイニシャライザファイルを作成しました。Rails RspecテストSlack :: Notifier

このような何か:

#my_app/confing/initializers/my_nagios.rb 
MyNagios::Check.class_eval do 
after_save :send_slack_notification 

private 

def send_slack_notification 
    ... 
    @notifier ||= Slack::Notifier.new "..." 
    ... 
    @notifier.ping "..." 

そして今のところ、私はこのカスタムコールバックのためのRSpecのテストを作成したいです。

私はこのような何かしてみてください:

describe MyNagios::Check do 
    let(:slack_notifier) { double(Slack::Notifier) } 

    it 'should send notification' do 
    ... some actions ... 
    expect(slack_notifier).to receive(:ping).with('test') # 'test' just for now, it will be replaced 

をしかし、私はエラーを受信:

(Double Slack::Notifier).ping("test") 
     expected: 1 time with arguments: ("test") 
     received: 0 times 

は私がSlack::Notifierかないためdoubleを使用する必要がありますか?私のテストで何が間違っていますか?

答えて

1

役立つかもしれない物事のカップル:

  1. あなたが示されていない@notifier変数のどこかを割り当てていない限りあなたのダブルが、使用されていません。 のSlack::Notifier.newのインスタンスがpingを受信して​​います。 slack_notifierダブルをMyNagiosインスタンスに渡すことができるように設定する必要があります。

  2. の前にが保存されている必要があります。したがって、「... some actions ...」の間にpingが発生すると思われる場合は、このポイントより上に期待値を移動する必要があります。一緒にすべてを置く

、あなたはこのような何かを得る必要があります。

class MyNagios 
    def initialize(slack_notifier) 
    @slack_notifier = slack_notifier 
    #... 
    end 
end 

# test 
it 'should send notification' do 
    #... some actions ... 
    expect(slack_notifier).to receive(:ping).with('test') 
    MyNagios.new(slack_notifier).save 
end 

希望に役立ちます!

+0

しかし、これらのテストは、宝石を使用するアプリではなく、宝石そのものに書く方がはるかに簡単です。 – omnikron

+0

ありがとうございました。まあ、最もエレガントな解決策ではありませんが、 'expect_any_instance_of(Slack :: Notifier).to receive(:ping).with( '...')とand_return(true)' –