RSpec Array instance_of Argument Matcher

时间:2013-07-11 17:16:37

标签: ruby rspec

我有一组Task s(即命令模式),它被发送到列表中的作业调度程序以进行线程化。我想验证它是否正在接收某个类TaskCreateTask,在此示例中)。它们是通过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))

1 个答案:

答案 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))