为方法内部的方法编写rspec


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最适合。

相关内容

  • 没有找到相关文章

最新更新