如何用Action Cable规范测试模块的多条广播消息?
Action Cable 多条广播消息的测试规范写法
首先回顾单条Action Cable广播消息的常规测试写法:
expect { ActionCable.server.broadcast "messages", text: 'Hi!' }.to have_broadcasted_to("messages").with(text: 'Hi!')
当测试一个会触发多条广播的模块时,你之前尝试的写法不符合RSpec规范——不能将expect { ... }的结果赋值给变量后重复调用to,这会导致断言上下文失效,无法正确捕获所有广播事件。
以下是几种规范的实现方式:
1. 同一频道的多条有序广播
如果需要严格断言每条广播的内容和顺序,可以链式调用and组合多个匹配器:
expect { function_i_am_testing() } .to have_broadcasted_to("channel").with("Expected message 1") .and have_broadcasted_to("channel").with("Expected message 2") .and have_broadcasted_to("channel").with("Expected message 3")
2. 同一频道的多条无序广播
如果不关心广播顺序,只需要确认所有预期消息都已发送,可使用contain_exactly匹配器:
expect { function_i_am_testing() }.to have_broadcasted_to("channel").with( contain_exactly( "Expected message 1", "Expected message 2", "Expected message 3" ) )
也可以结合次数断言和any_of来验证:
expect { function_i_am_testing() } .to have_broadcasted_to("channel").exactly(3).times .and have_broadcasted_to("channel").with( any_of("Expected message 1", "Expected message 2", "Expected message 3") )
3. 不同频道的多条广播
如果模块会向多个频道广播,同样可以通过链式and组合不同频道的断言:
expect { function_i_am_testing() } .to have_broadcasted_to("channel_a").with("Message for A") .and have_broadcasted_to("channel_b").with("Message for B")
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

