否定包含期望的自定义​​RSpec匹配器

时间:2018-08-07 11:34:52

标签: ruby-on-rails rspec rspec-rails rspec3

我有一个自定义的RSpec匹配器,用于检查作业是否已调度。它的用法如下:

expect { subject }.to schedule_job(TestJob)

schedule_job.rb:

class ScheduleJob
  include RSpec::Mocks::ExampleMethods

  def initialize(job_class)
     @job_class = job_class
  end

  ...

 def matches?(proc)
   job = double
   expect(job_class).to receive(:new).and_return job
   expect(Delayed::Job).to receive(:enqueue).with(job)
   proc.call
   true
 end

这对于肯定匹配非常有用。但这不适用于否定匹配。例如:

expect { subject }.not_to schedule_job(TestJob) #does not work

为使上述方法起作用,matches?方法需要在未达到期望的情况下返回false。问题在于,即使返回false,也无论如何都会创建期望值,因此测试会错误地失败。

关于如何制作类似作品的想法吗?

1 个答案:

答案 0 :(得分:0)

我不得不寻找它,但是我认为它在rspec documentation

中有很好的描述