【发布时间】:2018-08-07 11:34:51
【问题描述】:
我有一个自定义的 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,也已经创建了期望值,因此测试错误地失败了。
关于如何制作这样的东西有什么想法吗?
【问题讨论】:
-
您说
does not work时并不准确。当matches?失败时,AFAIR 否定匹配器将通过。因此,如果您对matches?的至少一个期望失败了,则它是yes的否定版本。这是你正在得到的行为吗?如果你想要别的东西 - 请更新你的问题。 -
如果
matches?方法本身的期望设置失败,我认为说matches?返回错误是不正确的。否定匹配器不起作用,因为当代码没有安排作业时,预期会失败,例如expect(job_class).to receive(:new).and_return job失败
标签: ruby-on-rails rspec rspec-rails rspec3