复杂的 RSpec 参数测试

G G*_*III 4 ruby rspec

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

例如,我的代码可能是这样的:

some_complex_object = ComplexObject.generate(params)
my_function(some_complex_object)
Run Code Online (Sandbox Code Playgroud)

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

test_complex_object = ComplexObject.generate(test_params)
subject.should_receive(:my_function).with(test_complex_object)
Run Code Online (Sandbox Code Playgroud)

但我肯定知道比较时ComplexObject#==会返回,因为这是所需的行为(在其他地方我依赖标准行为,因此不想超载它)。falsesome_complex_objecttest_complex_object==ComplexObject

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

有没有办法使用 Rspec 能够在测试中的参数之间进行更复杂的比较?理想情况下,我想要一些可以使用块的东西,这样我就可以编写任意比较代码。

Pet*_*vin 5

有关如何提供块来对传递给方法的参数进行任意分析的信息,请参阅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
Run Code Online (Sandbox Code Playgroud)

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