我如何在 minitest 中模拟和验证 ActionCable 传输?
How do I mock and verify an ActionCable transmission in minitest?
我在 Rails 5.1 上使用 Ruby 和 ActionCable。我想使用 minitest 来测试一个特定的方法,并模拟 "ActionCable.server.broadcast" 调用来验证我是否发送了我拥有的正确数据
module MyModule
class Scanner
def trasmit
...
ActionCable.server.broadcast "my_channel", data: msg_data
但我不知道如何在我的小型测试中 class 我可以验证 ActionCable 是否广播了正确的消息数据。
我建议使用模拟(我使用 mocha gem 进行模拟)来测试广播。这是一个简单的例子:
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
调用,但可以测试它们是否使用正确的参数调用。
Rails ActionCable source 已经过足够好的测试以确保其正常工作,因此我们知道如果我们使用正确的参数调用 ActionCable 广播就可以正常工作。
如果你有一个 socket-heavy 应用程序,我建议尝试 action-cable-testing,它有很多帮助程序来验证 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
这个 Gem 可能 很快就会成为 Rails 核心的一部分,所以它绝对值得一看,特别是如果你正在测试 ActionCable 的其他部分或稍后可能会模拟太多工作。 (例如,使用特定用户登录)。
我在 Rails 5.1 上使用 Ruby 和 ActionCable。我想使用 minitest 来测试一个特定的方法,并模拟 "ActionCable.server.broadcast" 调用来验证我是否发送了我拥有的正确数据
module MyModule
class Scanner
def trasmit
...
ActionCable.server.broadcast "my_channel", data: msg_data
但我不知道如何在我的小型测试中 class 我可以验证 ActionCable 是否广播了正确的消息数据。
我建议使用模拟(我使用 mocha gem 进行模拟)来测试广播。这是一个简单的例子:
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
调用,但可以测试它们是否使用正确的参数调用。
Rails ActionCable source 已经过足够好的测试以确保其正常工作,因此我们知道如果我们使用正确的参数调用 ActionCable 广播就可以正常工作。
如果你有一个 socket-heavy 应用程序,我建议尝试 action-cable-testing,它有很多帮助程序来验证 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
这个 Gem 可能 很快就会成为 Rails 核心的一部分,所以它绝对值得一看,特别是如果你正在测试 ActionCable 的其他部分或稍后可能会模拟太多工作。 (例如,使用特定用户登录)。