Как мне высмеивать и проверять передачу ActionCable в minitest?

Я использую Ruby on Rails 5.1 с ActionCable. Я хотел бы использовать minitest для тестирования конкретного метода и издеваться над вызовом "ActionCable.server.broadcast", чтобы проверить, что я отправляю правильные данные, которые у меня есть

module MyModule
  class Scanner

    def trasmit
    ...
        ActionCable.server.broadcast "my_channel", data: msg_data

но я не знаю, как в моем классе minitest я могу проверить, что ActionCable транслирует правильные данные сообщения.

Ответ 1

Rails Источник ActionCable уже достаточно хорошо протестирован для обеспечения его работоспособности, поэтому мы знаем, что работа в области широковещания работает, если мы просто вызываем ActionCable с правильными параметрами.

Если у вас есть приложение с поддержкой сокета, я рекомендую попробовать тестирование action-cable, в котором есть много помощника, чтобы убедиться, что ActionCable действительно что-то передает.

Вы можете проверить, транслирует ли ваш метод X раз в определенный канал:

class ScannerTest < ActionDispatch::IntegrationTest
    include ActionCable::TestHelper

    def test_my_broadcaster
       channel_name = 'my_channel'
       assert_broadcasts channel_name, 0

       # run your method (e.g. trasmit)
       assert_broadcasts channel_name, 1
    end
end

Или убедитесь, что ожидаемые данные были отправлены на канал:

class ScannerTest < ActionDispatch::IntegrationTest
    include ActionCable::TestHelper

    def test_my_broadcaster
       channel_name = 'my_channel'
       expected_data = { :hello => "world" }
       assert_broadcast_on(channel_name, data: expected_data) do
          # run your trasmit method here which should call:
          ActionCable.server.broadcast channel_name, data: expected_data 
       end
    end
end

Этот драгоценный камень может быть частью ядра Rails в ближайшее время, поэтому он определенно стоит посмотреть, особенно если вы тестируете другие части ActionCable, которые рано или поздно могут быть слишком сложными для макета. (Например, войдите с определенным пользователем).

Ответ 2

Я предлагаю использовать mocks (я использую мокко- жемчужину для насмешки), чтобы проверить трансляцию. Вот простой пример:

channel_name = 'my_channel'
msg_data = 'hello'

broadcast = mock
server = mock
server.expects(:broadcast).with(channel_name, data: msg_data).returns(broadcast)

ActionCable.expects(:server).returns(server)

Таким образом, вы издеваетесь над всеми вызовами ActionCable.server но проверяете, что они вызываются с правильными параметрами.