2014-01-26 2 views
2

У меня есть почтовая программа, которая использует «open-uri».Как выкрикивать вызовы open-uri

require 'open-uri' 
class NotificationMailer < ActionMailer::Base 

    def welcome(picasa_picture) 
    picture = picasa_picture.content.src 
    filename = picture.split('/').last 
    attachments.inline[filename] = open(picture).read 
    mail(
     to: '[email protected]', 
     from: '[email protected]', 
     subject: 'hi', 
    ) 
    end 
end 

Но когда я пытаюсь проверить что-нибудь класс, я получаю эту ошибку:

SocketError: 
    getaddrinfo: nodename nor servname provided, or not known 

Я нашел SO сообщения: How to rspec mock open-uri и думал, что это поможет. Я дал это попробовать:

let(:pic_content) { double(:pic_content, src: 'http://www.picasa/asdf/asdf.jpeg') } 
let(:picture) { double(:picture, content: pic_content) } 
let(:open_uri_mock) { double(:uri_mock, read: true) } 

subject { described_class.welcome(picture) } 

it 'renders email address of sender' do 
    subject.stub(:open).and_return(open_uri_mock) 
    subject.from.should == [ sender_address ] 
end 

Я также попытался «should_receive» вместо «окурок», но это не помогло.

Как подавить открытый метод open-uri так, чтобы он (1) не пытался выйти в интернет и (2) не нарушил мои тесты?

+0

Я не уверен, что вы гася открытый метод правого объекта здесь –

+0

, насколько я могу вам сказать, 're stubbing после того, как вы вызвали метод, чтобы он не работал –

+0

этот пост, кажется, думает, что вы делаете заглушку на ядре: https://stackoverflow.com/questions/3603256/rspec-how-to-stub-open –

ответ

1

Почему не реорганизовывать:

require 'open-uri' 
class NotificationMailer < ActionMailer::Base 

    def welcome(picasa_picture) 
    picture = picasa_picture.content.src 
    filename = picture.split('/').last 
    attachments.inline[filename] = open_and_read(picture) 
    mail(
     to: '[email protected]', 
     from: '[email protected]', 
    subject: 'hi', 
    ) 
    end 

    def open_and_read(picture) 
    open(picture).read 
    end 

end 

Затем вы можете окурок и тест:

subject { NotificationMailer } 

before do 
    subject.stub(:open_and_read).and_return(:whatever_double_you_want) 
    subject.welcome(picture) 
end 

it 'renders email address of sender' do 
    subject.from.should == [ sender_address ] 
end 
+1

красивая. Хорошее решение. Мне пришлось пойти с 'describe_class.any_instance.stub (: open_and_read) .with (picture) .and_return ('picture_as_url')', чтобы заставить его работать, но все тесты проходят сейчас. Благодаря! –

+0

, вероятно, также хочет перейти с новым синтаксисом rspec: '' 'ожидать (subject.from) .to eq ([sender_address])' '' –

Смежные вопросы