我有一组Task
s(即命令模式),它被发送到列表中的作业调度程序以进行线程化。我想验证它是否正在接收某个类Task
(CreateTask
,在此示例中)。它们是通过perform_tasks!
安排的,它会列出它应该交给线程的任务对象列表。
为了在rspec中测试这个,我设置了以下内容:
it "should dispatch a Create Task" do
<... setup ... >
TaskScheduler.should_receive(:perform_tasks!) do |*args|
args.pop[0].should be_a CreateTask
end
<... invocation ... >
end
我找到了match_aray(...)
,但我似乎无法弄清楚如何让它很好地测试,因为它会测试内容,而不是它们的类型。是否有更短或更好的方法来测试这个?基本上,有类似的东西:
TaskScheduler.should_receive(:perform_tasks!).with(array_containing_a(CreateTask))
答案 0 :(得分:0)
我不确定是否有现有的匹配器,但你可以很容易地编写一个自定义匹配器:
RSpec::Matchers.define :array_of do |expected|
match do |actual|
actual.map(&:class).uniq.should =~ Array(expected)
end
end
TaskScheduler.should_receive(:perform_tasks!).with(array_of(CreateTask))
这将确保数组中的所有值与传递的类型或类型数组匹配。如果您只想检查数组中的任何一个值是否与您的类型匹配,那么这也很容易:
RSpec::Matchers.define :array_containing_a do |expected|
match do |actual|
actual.map(&:class).should include expected
end
end
TaskScheduler.should_receive(:perform_tasks!).with(array_containing_a(CreateTask))