我有一个自定义的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,也无论如何都会创建期望值,因此测试会错误地失败。
关于如何制作类似作品的想法吗?