gpt4 book ai didi

ruby - rspec 中的 double 方法有什么用?

转载 作者:数据小太阳 更新时间:2023-10-29 06:23:31 24 4
gpt4 key购买 nike

在 rspec 文档中说明我应该使用 double 方法来创建测试替身。但我可以看到,即使我不使用 double,它也能正常工作。不使用double有什么问题吗?另外,如果我不使用 double MyClass 如何获取 stub 和其他 rspec 方法?在 rspec 中运行时,它们是否可用于所有对象?

require 'spec_helper'

class MyClass

def self.run
new.execute
end

def execute
'foo'
end

end

describe MyClass do

it 'should stub instance method' do
obj = MyClass.new
obj.stub(:execute).and_return('bar')
obj.execute.should == 'bar'
end

it 'should stub class method' do
MyClass.stub(:run).and_return('baz')
MyClass.run.should == 'baz'
end

end

最佳答案

编辑:我刚刚重读了您的问题并意识到我没有完全回答它。留下我原来的答案,因为它是相关的,但这是你的具体答案:

您不需要 double 的原因是因为您正在 stub 类方法,而不是实例方法。 double 只对处理类的实例有用,对类本身没有用。

旧答案解释了更多:

您应该尽可能使用真正的类而不是测试替身。这将使用更多的代码并使您的测试更全面。测试替身用于您不能或不应该使用真实对象的情况。例如,如果一个类在不使用外部资源(如网络或数据库)的情况下无法实例化,或者具有大量依赖项,而您只是在测试使用它的东西,您可能想要创建一个double 并在 double 上 stub 一些方法。

这里有一个更具体的例子:假设你正在测试MyClass,但是为了实例化MyClass,你需要传入一个FooLogger:

mylogger = FooLogger.new
myclass = MyClass.new logger: mylogger

如果 FooLogger.new 打开一个 syslog 套接字并立即开始向它发送垃圾邮件,那么每次运行测试时,您都会进行记录。如果您不想在此测试期间向您的日志发送垃圾邮件,您可以为 FooLogger 创建一个 double 并在其上 stub 一个方法:

mylogger = double(FooLogger)
mylogger.stub(:log)
myclass = MyClass.new logger: mylogger

因为大多数设计良好的类都可以在没有任何副作用的情况下被实例化,所以您通常可以只使用真实对象而不是 double 对象,并在其上使用 stub 方法。在其他情况下,类具有许多依赖项,这使得它们难以实例化,而 double 是一种解决问题并测试您真正关心的事情的方法。

根据我的经验,需要使用 double 是一种代码味道,但我们经常不得不使用我们无法轻易更改的类(例如,从 gem 中),所以它是您可能不时需要的工具。

关于ruby - rspec 中的 double 方法有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15252314/

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