2013-05-15 1 views
1

Tet что у меня есть класскак передать блок RSpec «с» ожиданием

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 новый экземпляр получит

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 

спасибо


UPDATE: Кажется, это немного непонятно, о чем я спрашиваю здесь, так:

Я ищу способ гарантировать, что Publication.new был вызван явно с набором аргументов, в этом случае блок

так Я полагаю, что-то вроде этого

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

где параметры блока owner_type == 'Foo' и owner_id == 123

ответ

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

довольно элегантный, thx – equivalent8

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