2016-10-13 14 views
1

この質問を読んだ後、私は本当に答えが嫌いです。RSpec - オブジェクトが#initializeで自己にメッセージを送信するかどうかをテストする方法

Rails/RSpec: How to test #initialize method?

たぶん私は、第三のシナリオを持っています。これは私の今のものです。その答えの2番目のコードに触発されています。

# Picture is collection of SinglePictures with same name and filename, 
# but different dimensions 
class Picture 
    attr_accessor :name, :filename 
    attr_reader :single_pics, :largest_width 

    def initialize(name, filename, dimensions=nil) 
    @largest_width = 0 
    @single_pics = {} 
    add_single_pics(dimensions) if dimensions 
    end 

    def add_single_pics(max_dimension) 
    # logic 
    end 
end 

describe '#initialize' do 
    it 'should not call add_single_pics if dimensions is not given' do 
    subject = Picture.new('Test Picture', 'Test-Picture') 
    expect(subject.largest_width).to eq 0 
    end 

    it 'should call add_single_pics if dimensions are given' do 
    subject = Picture.new('Test Picture', 'Test-Picture', 1920) 
    expect(subject.largest_width).to eq 1920 
    end 
end 

私は#initializeテストでadd_single_picsの機能をテストしているので、これは本当に好きではありません。

expect(subject).not_to have_received(:add_single_pics) 
    expect(subject).to have_received(:add_single_pics) 

しかし、私は

Expected to have received add_single_pics, but that object is not a spy 
or method has not been stubbed. 

が、私は何とかこの問題を解決することができ得る:私はスペックで何とかこれを書きたいですか?

答えて

3

スパイは、メッセージがhave_received使用して、 事実の後に受信されていることを期待できるようにすることで、このパターン をサポートするテストダブルの代替タイプです。

https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/basics/spies

のみスパイオブジェクトは、メソッド呼び出しを格納することができます。あなたが望む方法であなたの実際のクラスをテストするには、クラスが初期化される前にexpect_any_instance_ofステートメントを使用する必要があります。

expect_any_instance_of(Picture).to receive(:add_single_pics) 
Picture.new('Test Picture', 'Test-Picture') 

この場合、あなたのadd_single_picsメソッドが呼び出されますが、そのロジックが実行されません、あなたはそれを実行する必要がある場合は、整合にand_call_originalメソッドを呼び出す必要があります:

expect_any_instance_of(Picture).to receive(:add_single_pics).and_call_original 
+0

あまりにも悪い、彼らはそれがレガシーコードのためだし、それを使用したいことはコードのにおいであると言います。私はこのコードを私が嗅覚的に書きましたか?笑。 'Picture'クラスを使用するときに、新しい行の後にadd_single_picsを呼び出す必要がなく、コード行を節約したいと思いました。 –

関連する問題