1

テトは私がクラスを持っていると言います

Class Foo < ActiveRecord::Base

  def set_publication
      Publication.new do |publication|
        publication.owner_type = 'Foo'
        publication.owner_id   =  123
      end
      return 'something else'
  end
end

質問: Publication new instance が受け取るブロックをテストするにはどうすればよいですか?

describe Foo, 'set_publication' do
  let(:foo){ Foo.new }

  it do
    Publication.should_recive(:new).with( ??????? ).and_return( double(:something) )
    foo.set_publication
  end
end

もちろん、これは非常に複雑な機能の例にすぎず、このようなハッシュ引数を使用することはできません

Class Foo < ActiveRecord::Base

  def set_publication
     Publication.new owner_type: 'Foo', owner_id: 123         
     return 'something else'
  end
end

そして、このようにテストします

describe Foo, 'set_publication' do
  let(:foo){ Foo.new }

  it do
    Publication.should_recive(:new).with( owner_type: "Foo", owner_id: 123 ).and_return( double(:something) )
    foo.set_publication
  end
end

ありがとうございました


更新:私がここで何を求めているのか少し不明なようです:

Publication.new一連の引数、この場合はブロックで明示的に呼び出されたことを確認する方法を探しています

だから私はこのようなものだと思います

Publication.should_receive(:new).with(&block) # example

ここで、ブロック パラメーター owner_type == 'foo' および owner_id == 123

4

2 に答える 2

1

これを実現するために and_yield を使用できます。

class Foo
  def set_publication
    Publication.new do |publication|
      publication.owner_type = 'Foo'
      publication.owner_id   =  123
    end
    return 'something else'
  end
end

class Publication
  attr_accessor :owner_id, :owner_type

  def initialize
    yield self if block_given?
  end
end

そしてスペック

describe Foo do 
  let(:foo) { Foo.new }
  let!(:publication) { Publication.new }

  it do
    Publication.should_receive(:new).and_yield(publication)

    foo.set_publication

    publication.owner_type.should eq 'Foo'
    publication.owner_id.should eq 123
  end
end
于 2013-05-15T11:32:07.457 に答える
0

私の唯一の可能な(そして機能する)解決策は次のとおりです。

Class Foo < ActiveRecord::Base

  def set_publication
      Publication.new &publication_block_params(123)
      return 'something else'
  end

  def publication_block_params(some_id)
    Proc.new do |publication|
      publication.owner_type = 'Foo'
      publication.owner_id   =  some_id # could be self.id but let's keep it this way 
    end
  end

end

と仕様

describe Foo, 'set_publication' do
  let(:foo){ Foo.new }
  let(:my_block){ Proc.new {} }

  it do
    foo.should_receive(:publication_block_params).with(123).and_return(my_block)
    Publication.should_receive(:new).with( &my_block ).and_return( double(:something) )

    foo.set_publication
  end
end

パブリケーション ブロック パラメータの仕様を個別に作成するよりも

describe Foo, 'publication_block_params' do
  let(:foo){ Foo.new }

  it do      
    publication = Publication.new &foo.publication_block_params(123)
    publication.owner_id.should   be 123
    publication.owner_type.should be 'Foo'
  end
end
于 2013-05-15T13:38:57.243 に答える