如何在minitest中模拟和验证ActionCable传输?

Dav*_*ave 11 ruby-on-rails mocking minitest ruby-on-rails-5 actioncable

我正在使用带有ActionCable的Ruby on Rails 5.1.我想使用minitest测试一个特定的方法,并模拟"ActionCable.server.broadcast"调用以验证我发送的数据是否正确

module MyModule
  class Scanner

    def trasmit
    ...
        ActionCable.server.broadcast "my_channel", data: msg_data
Run Code Online (Sandbox Code Playgroud)

但我不知道在我的minitest类中我如何验证ActionCable如何广播正确的消息数据.

Pas*_*zyk 5

Rails ActionCable源已经经过充分测试以确保其正常工作,因此我们知道如果我们只使用正确的参数调用ActionCable就可以进行广播工作.

如果你有一个套接字繁重的应用程序,我建议尝试动作电缆测试,它有很多帮助来验证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
Run Code Online (Sandbox Code Playgroud)

或验证预期数据是否已发送到频道:

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
Run Code Online (Sandbox Code Playgroud)

这个Gem 可能很快就会成为Rails核心的一部分,所以它绝对值得一看,特别是如果你正在测试ActionCable的其他部分,它们迟早可能需要太多的工作来模拟.(例如,使用特定用户登录).