Тестирование ActiveSupport :: Уведомления с помощью rspec - PullRequest
6 голосов
/ 24 августа 2011

Кто-нибудь знает, как вы можете специфицировать уведомление активной поддержки? Следующее не похоже на работу. Он обнаруживает уведомления рамок рельсов по умолчанию, но не мой пользовательский.

it 'sends a "product.search" notification to any subscribers listening'
  ActiveSupport::Notifications.should_receive(:instrument).with("product.search", :search => search) 
  get :search, ...
end

Если я изменяю спецификацию, чтобы проверить результат кода подписчика (например, изменение количества записей при создании записи в БД), он проходит. Это подтверждает, что все работает нормально. Но, кажется, неправильно указывать, что подписчик делает здесь, я просто хочу указать, что уведомление отправляется. Любые мысли будут оценены.

EDIT:

Вот код контроллера, который я пытаюсь указать:

ActiveSupport::Notifications.instrument("product.search", :search => 'test')

Ответы [ 2 ]

5 голосов
/ 28 июля 2012

У меня была та же проблема, и я написал следующий вспомогательный метод rspec ниже:

  def notification_payload_for(notification)
    payload = nil
    subscription = ActiveSupport::Notifications.subscribe notification do |name, start, finish, id, _payload|
      payload = _payload
    end

    yield

    ActiveSupport::Notifications.unsubscribe(subscription)

    return payload
  end

Таким образом, я могу использовать его следующим образом:

 it "should raise the my_notification_name notification" do
    payload = notification_payload_for('my_notification_name') do
      # do stuff that should raise the proper notification
    end

    # test to see that the payload has the correct info
  end
2 голосов
/ 16 сентября 2011

Мне не удалось выполнить тест с помощью обычного действия :get, что-то должно как-то мешать, и только уведомления start_processing и process_action запускаются. Я думаю, это было отключено ради производительности.

Но это успешно работает:

it 'sends a "product.search" notification to any subscribers listening'
  ActiveSupport::Notifications.should_receive(:instrument).with("product.search", :search => "test")
  controller.index
end
...