复杂的RSpec参数测试

时间:2014-07-18 17:29:45

标签: ruby rspec

我有一个我想测试的方法是用特定对象调用的。但是,识别这个对象有点复杂,因为我对该对象的特定实例不感兴趣,而是符合某些条件。

例如,我的代码可能是:

some_complex_object = ComplexObject.generate(params)
my_function(some_complex_object)

在我的测试中,我想检查一下

test_complex_object = ComplexObject.generate(test_params)
subject.should_receive(:my_function).with(test_complex_object)

但我绝对知道ComplexObject#==在比较falsesome_complex_object时会返回test_complex_object,因为这是期望的行为(我在其他地方依赖标准的==行为所以不要为ComplexObject)重载它。

我认为这是一个问题,我发现自己需要编写这样的测试,并且更愿意重新构建代码,以便我不需要编写这样的测试,但是不幸的是,这是一项需要重写大量现有代码的大得多的任务,因此我想要达到一个长期修复但现在无法在时间限制内完成。

Rspec有没有办法在测试中对参数进行更复杂的比较?理想情况下,我喜欢可以使用块的东西,所以我可以编写任意比较代码。

1 个答案:

答案 0 :(得分:2)

有关如何提供块来对传递给方法的参数进行任意分析的信息,请参阅https://www.relishapp.com/rspec/rspec-mocks/v/2-7/docs/argument-matchers,如下所示:

expect(subject).to receive(:my_function) do |test_complex_object|
   # code setting expectations on test_complex_object
end

您还可以定义一个自定义匹配器,它可以让您评估对象以查看是否满足条件,如https://www.relishapp.com/rspec/rspec-expectations/v/2-3/docs/custom-matchers/define-matcher

中所述