我是RSpec的新手,正在深入探索。我希望只是为了熟悉RSpec DSL来测试一些简单的函数。那么,关键点:我如何使用RSpec的3.1.7语法测试下面的snippit?更具体地说,我如何测试函数是否被调用?
manipulate_loc(loc, op, n)
x = loc.x.send(op, n)
y = loc.y.send(op, n)
yield x, y
end
def scale_up(loc, n)
manipulate_loc(loc, :*, n)
end
it 'can scale up Locations' do
expect(scale_up(subject,2)).to receive(:manipulate_loc).with(subject, 2)
end
我明白这是一个奇怪的例子,因为我正在传递块,但是没有块的红宝石会是什么!
答案 0 :(得分:1)
要测试是否调用了某个方法,请模拟该方法(创建一个假方法),该方法将模仿您正在测试其调用的方法。在Ruby中,所有函数都是 something 上的方法,即使它是主要对象(在此上下文中为self
)。如果您实际上正在某个类上测试方法(正如您所希望的那样; Ruby代码的可维护性在main上定义方法非常糟糕),请将self
替换为Foo.new
或类似。
当你没有告诉我们这些功能应该做什么,然后不正确地写它们时,很难创建一个测试用例,所以我会稍微修改它们,你可以稍后调整它们对你的用例:
def manipulate_loc(loc, op, n)
x = loc.x.send(op, n)
y = loc.y.send(op, n)
[x, y]
end
def scale_up(loc, n)
manipulate_loc(loc, :*, n)
end
it 'can scale up Locations' do
expect(self).to receive(:manipulate_loc).with(subject, :*, 2).and_return([4, 10])
expect(scale_up(subject, 2)).to equal([4, 10])
end
expect... to receive... with... and_return...
正在制作一个假冒的方法,该方法以指定的方式运行并用它替换你的方法。如果调用伪方法,则测试通过。 (还有一种期望,你调用的方法是调用你的模拟方法实际上正在做正确的事。)