在Ruby的RSpec测试框架中,如果你想要让一个存根(stub)在每次调用时都有不同的行为,你可以使用and_return
方法结合块(block)或者yield
关键字来实现。这样可以让你在每次调用存根时执行不同的代码逻辑。
以下是一个使用块来实现每次调用都有不同行为的例子:
RSpec.describe "Stubbing with different behaviors" do
let(:my_object) { double("MyObject") }
it "returns different values on each call" do
allow(my_object).to receive(:my_method) do |arg|
# 这里可以根据传入的参数或其他条件返回不同的值
case arg
when 1 then "first"
when 2 then "second"
else "unknown"
end
end
expect(my_object.my_method(1)).to eq("first")
expect(my_object.my_method(2)).to eq("second")
expect(my_object.my_method(3)).to eq("unknown")
end
end
在这个例子中,my_method
存根根据传入的参数返回不同的字符串值。
如果你想要在存根调用时执行一些代码并返回结果,可以使用yield
关键字:
RSpec.describe "Stubbing with yield" do
let(:my_object) { double("MyObject") }
it "yields different blocks on each call" do
allow(my_object).to receive(:my_method) do |&block|
# 这里可以执行传入的块,并根据需要返回不同的结果
block.call
end
expect(my_object.my_method { "first" }).to eq("first")
expect(my_object.my_method { "second" }).to eq("second")
end
end
在这个例子中,my_method
存根执行传入的块,并返回块的结果。
这些技巧可以帮助你在RSpec测试中创建更加灵活和动态的存根行为。记住,使用这些高级特性时要小心,确保你的测试仍然保持清晰和可维护。
参考链接:
领取专属 10元无门槛券
手把手带您无忧上云