RSpec测试是否调用了函数

时间:2014-12-15 01:46:30

标签: ruby rspec

我是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

我明白这是一个奇怪的例子,因为我正在传递块,但是没有块的红宝石会是什么!

1 个答案:

答案 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...正在制作一个假冒的方法,该方法以指定的方式运行并用它替换你的方法。如果调用伪方法,则测试通过。 (还有一种期望,你调用的方法是调用你的模拟方法实际上正在做正确的事。)