2015-05-18 2 views
1

Я пытаюсь проверить подписку MailChimp к определенному списку:окурки MailChimp апи вызов для функционального тестирования

тест/функционал/some_controller_test.rb

require 'test_helper' 

class SomeControllerTest < ActionController::TestCase 
    test "invalid signup" do 
    Gibbon.stubs(:subscribe).raises(Gibbon::MailChimpError, 500) 
    post :signup, {:EMAIL => "invalid_email"} 
    assert_response 500 
    end 

    test "valid signup" do 
    Gibbon.stubs(:subscribe).returns(200) 
    post :signup, {:EMAIL => "[email protected]"} 
    assert_response 200 
    end 
end 

Контроллеры/some_controller.rb

class SomeController < ApplicationController 
    def signup 
    begin 
     gb = Gibbon::API.new 
     resp = gb.lists.subscribe(
     :id => ENV["key_list"], 
     :email => {:email => "#{params[:EMAIL]}"} 
    ) 
     render :status => :ok, :json => resp 
    rescue Gibbon::MailChimpError => e 
     render :status => :internal_server_error, :json => {error: e, message: e.message} 
    end 
    end 
end 

Но я думаю, что я здесь что-то пропустил, потому что тесты проходят, но они делают вызов API, потому что, поскольку я использую свое электронное письмо для целей тестирования, я получаю подтверждение по электронной почте ция от MailChimp каждый раз, когда я бегу:

"rake test:functionals" 

И если я пытаюсь запустить:

Gibbon.any_instance.stubs(:subscribe).raises(Gibbon::MailChimpError, 500) 

или

Gibbon.any_instance.stubs(:subscribe).returns(200) 

я получаю следующие ошибки:

test_invalid_signup(SomeControllerTest): 
NoMethodError: undefined method 'any_instance' for Gibbon:Module 

test_valid_signup(SomeControllerTest): 
NoMethodError: undefined method 'any_instance' for Gibbon:Module 

EDIT I ​​

Я был в состоянии использовать any_instance метод делает это:

require 'test_helper' 

class NewsletterControllerTest < ActionController::TestCase 
    test "invalid signup" do 
    gb = Gibbon::API.new 
    gb.any_instance.stubs(:subscribe).raises(Gibbon::MailChimpError, 500) 
    post :signup, {:EMAIL => "invalid_email"} 
    assert_response 500 
    end 

    test "valid signup" do 
    gb = Gibbon::API.new 
    gb.any_instance.stubs(:subscribe).returns(200) 
    post :signup, {:EMAIL => "[email protected]"} 
    assert_response 200 
    end 
end 

Но до сих пор делает вызов к API.

ответ

2

Я привык к RSpec (не TestUnit/Mocha), поэтому я не слишком хорошо знаком с правильным синтаксисом здесь.

Однако, я замечаю, что вам нужно заглушить any_instance из Gibbon::API, так что я предполагаю, что Gibbon::API.any_instance - это то, что вам нужно хотя бы. Кроме того, вам нужно будет заглушить как lists, так и метод subscribe.

Итак, я предполагаю, что-то, как это должно работать в вашем valid signup теста:

lists = stub(subscribe: stub) 
Gibbon::API.any_instance.stubs(:lists).returns(lists) 

Я не думаю, что вам придется вернуться 200, так это то, что делают делает.

+0

hi @newmediafreak, я пробовал ваш ответ, но я получил эту ошибку: test_valid_signup (SomeControllerTest): ActiveSupport :: JSON :: Encoding :: CircularReferenceError: объекты ссылаются сами. Я смотрю, почему. – nisevi

+0

после прочтения этого: github.com/rspec/rspec-mocks/issues/78 Я сделал некоторые изменения Gibbon :: API.any_instance.stubs ({: EMAIL => "[email protected]"}). Возвращает (списки) но я все еще сталкиваюсь с API MailChimp, и это то, чего я хочу избежать .... жаль, что задержка в ответе API MailChimp заставило меня подумать, что его ответ был прав ... – nisevi

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