我有一个我想测试的方法是用特定对象调用的。但是,识别这个对象有点复杂,因为我对该对象的特定实例不感兴趣,而是符合某些条件。
例如,我的代码可能是:
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#==
在比较false
和some_complex_object
时会返回test_complex_object
,因为这是期望的行为(我在其他地方依赖标准的==
行为所以不要为ComplexObject
)重载它。
我认为这是一个问题,我发现自己需要编写这样的测试,并且更愿意重新构建代码,以便我不需要编写这样的测试,但是不幸的是,这是一项需要重写大量现有代码的大得多的任务,因此我想要达到一个长期修复但现在无法在时间限制内完成。
Rspec有没有办法在测试中对参数进行更复杂的比较?理想情况下,我喜欢可以使用块的东西,所以我可以编写任意比较代码。
答案 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
中所述