【问题标题】:how to pass block to RSpec "with" expectation如何将块传递给“有”期望的 RSpec
【发布时间】:2013-05-15 11:02:15
【问题描述】:

说我有课

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

问题:如何测试发布新实例将收到的块

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

【问题讨论】:

    标签: rspec2 rspec-rails


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      到目前为止,我唯一可能(且有效)的解决方案是:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-26
        • 2010-10-18
        • 2017-06-20
        • 2021-01-13
        • 2010-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多