我有一个函数让我们说A的输出和功能我必须测试,A调用另一个函数B,这需要花费大量的时间来计算输出。所以我试图使用存根来模仿B返回的所有值。
Text you want to convert to a SHA-256 hash:
现在测试文件
\"
我的目标是将B的预期输出传递给函数A.我正在使用RSpec。我该怎么做呢?
答案 0 :(得分:2)
使用RSpec,您可以:
allow(ClassName).to receive(:B).and_return([1,2,3,4,5])
在此之后你可以调用B函数,它将返回[1,2,3,4,5]
您可以在RSpec文档中找到更多信息:https://relishapp.com/rspec/rspec-mocks/v/3-4/docs/configuring-responses/returning-a-value
答案 1 :(得分:0)
我试图为您想要测试的内容编写一些类和测试用例。这里的关键是使用allow
来删除方法的返回值。
请注意,我已经将类中的方法更改为类方法以适合您的测试用例,但显然可以将它们更改回实例方法以适合您的目的。另外,接受的Ruby样式是使用小写的方法名称。
class ClassName
def self.B
# returns something that we're going to stub out
end
end
class TestClass
def self.A
# do something
output = ClassName.B
# do something with output
# eg in this case, add a value to it
output << 2
end
end
describe TestClass do
describe '.A' do
before do
allow(ClassName).to receive(:B).and_return([0, 1])
end
it 'does something with output' do
expect(described_class.A).to eq([0, 1, 2])
end
end
end
答案 2 :(得分:0)
有其他帖子中提到的方法,但我会给你另一个:你可能想要明确这种依赖。
以下是它的样子:
# test_class.rb
class TestClass
# The default will be automatically setup to be an object of type ClassName
def initialize(some_collaborator: ClassName.new)
self.some_collaborator = some_collaborator # Some people will probably also insert some guard (to make sure it responds to `b`
end
def a
# your code calling `some_collaborator.b`
end
private
attr_accessor :some_collaborator
end
# test_class_spec.rb
describe TestClass do
let(:stub_b) { stub("Some instance of ClassName", b: [...] }
subject { TestClass.new(some_collaborator: stub_b) }
it "whatever" do
expect(subject.a).to ...
end
end
默认协作者应该是一个合理的默认值(如果你无法实例化它,那么无论如何都有封装它的方法)。它不仅更容易阅读,而且更容易维护。