2

スレッドのリストでジョブ スケジューラに送信される一連のTasks (つまり、コマンド パターン) があります。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))
4

1 に答える 1

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))
于 2013-07-11T18:03:40.867 に答える