2016-09-16 2 views
0

У меня есть собственный камень (только для обучения). Итак, у меня есть тестовое приложение, которое использует мой драгоценный камень. В моем приложении я создал файл инициализации для добавления пользовательского обратного вызова для моей модели gem.Rails Rspec test 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 

Должен ли я использовать double для Slack::Notifier или нет? Что не так в моем тесте?

ответ

1

Несколько вещей, которые могли бы помочь:

  1. Ваш двойник не используется, если вы не назначаете переменную где-то @notifier, что вы не показано. Экземпляр Slack::Notifier.new в config/initializers/my_nagios.rb - это то, что получает пинг. Вам нужно настроить его так, чтобы вы могли передать свой slack_notifier двойной экземпляр MyNagios.

  2. ожидание должно быть установлено до перед тем происходит сохранение, так что если пинг должно произойти во время «... некоторые действия ...», то вам нужно переместить ваш ожидать выше этой точки.

Собираем все вместе, вы должны получить что-то вроде этого:

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

Тем не менее, вам, вероятно, было бы намного легче написать эти тесты в самом камне, а не в приложении _using_ gem. – omnikron

+0

Спасибо за помощь. Ну, не самое изящное решение, но теперь я использую что-то вроде этого: 'expect_any_instance_of (Slack :: Notifier) ​​.to receive (: ping) .with ('...'). And_return (true)' –