存储要测试的功能内部的功能

时间:2016-04-29 10:14:48

标签: ruby unit-testing rspec

我有一个函数让我们说A的输出和功能我必须测试,A调用另一个函数B,这需要花费大量的时间来计算输出。所以我试图使用存根来模仿B返回的所有值。

Text you want to convert to a SHA-256 hash:

现在测试文件

\"

我的目标是将B的预期输出传递给函数A.我正在使用RSpec。我该怎么做呢?

3 个答案:

答案 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

默认协作者应该是一个合理的默认值(如果你无法实例化它,那么无论如何都有封装它的方法)。它不仅更容易阅读,而且更容易维护。