def some_helper(exam)
x = 1
y = 2
if condition1
x = 3
y = 4
end
if condition2
x = 5
y = 6
end
return_something_base_on_x_y(x,y)
end
def return_something_base_on_x_y(x,y)
return "#{1}/#{2}" if x==1, y==2
return "#{3}/#{4}" if x==3, y==4
return "#{5}/#{6}" if x==5, y==6
end
我会像这个一样呼叫
some_helper(exam) # exam is an object
如何为帮助者编写rspec?我能写一些类似贝娄的东西吗。只测试传递给方法的参数
describe "#some_helper" do
let(:exam) { Exam.create exam_params }
context "condition 1" do
it do
expect "some_helper" already call return_something_base_on_x_y with arguments(1,2) inside them
expect "some_helper" already call return_something_base_on_x_y with arguments(3,4) inside them
expect "some_helper" already call return_something_base_on_x_y with arguments(5,6) inside them
end
end
end
我能避免像那样写吗
expect(some_helper(exam)).to eq "123" # and 456.
因为如果条件更复杂,我必须得到一个return_something_base_on_x_y结果的列表。
在调用方法之前,可以使用double:设置对方法的期望值
it "sets an expectation that a method should be called"
obj = double('obj')
expect(obj).to recive(:foo).with('bar')
obj.foo('bar')
end
如果未调用obj.bar
,则该示例将失败。
您可以在调用完成后使用间谍设置对对象的期望值:
obj = spy('obj')
obj.foo('bar')
expect(obj).to have_recived(:foo).with('bar')
这允许您在动作、排列、断言模式之后安排测试(或者在BDD术语中,当给定时(。
我能避免像一样写作吗
expect(some_helper(exam)).to eq "123" # and 456.
是的,但它实际上可能会降低您的测试。Stubbing可以掩盖错误,使代码更多地测试实现(代码如何完成其工作(,而不是行为(结果(。
当您正在测试的对象接触到应用程序边界或不是幂等的(例如生成随机值的方法(时,Stubbing最适合。