2016-04-29 8 views
1

私は、Aの出力と機能をテストしなければならないAという関数を持っていますが、出力を計算するのに多くの時間を要する別の関数Bを呼び出します。だから私はスタブを使用して、Bが返すすべての値を模倣しようとしています。テストする関数の中にある関数をスタブする

def A 
    #do something 
    output = B 
    #do something with output 
end 

今テストファイル

describe "check what A returns" do 
    ClassName.stub(:B) do 
    [0, 1] 
    end 
    test_values = TestClass.A(input parameters) 
    #checks on test values 
end 

私の目的は、私はRSpecのを使用していた機能AにBの予想される出力を通過させることです。それについてどうすればいいですか?

あなたが行うことができますRSpecので

答えて

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 
+0

私はallowの代わりに 'ClassName.stub(:B).and_return([0、1])'を使用しています –

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 

:ここ

はそれのように見えることができる方法です。読めるようになるだけでなく、保守が容易になります。

関連する問題