gpt4 book ai didi

ruby - RSpec 测试函数是否被调用

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:34 25 4
gpt4 key购买 nike

我是 RSpec 的新手,正在深入研究。我希望测试一些简单的功能来熟悉 RSpec DSL。所以,直截了当:我将如何使用 RSpec 的 3.1.7 语法测试以下代码片段?更具体地说,如何测试函数是否被调用?


代码:

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

我知道这是一个奇怪的例子,因为我传递的是方 block ,但是没有方 block 的 ruby​​ 会怎样呢!

最佳答案

要测试一个方法是否被调用,您可以模拟该方法(创建一个假方法),该方法将模仿您正在测试其调用的方法。在 Ruby 中,所有函数都是 something 上的方法,即使那是主要对象(在此上下文中为 self)。如果您实际上是在某个类上测试方法(您应该这样做;在 main 上定义方法对 Ruby 代码的可维护性非常不利),请将 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...toreceive...with...and_return... 正在制作一个以指定方式运行的假方法,并用它替换您的方法。如果调用了假方法,则测试通过。 (还有一个进一步的期望,即您调用的调用模拟方法的方法实际上是在做正确的事情。)

关于ruby - RSpec 测试函数是否被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com