1

特定のリストへの 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 => "my_email@something.com"}
    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

編集私

これを行う 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 => "my_email@something.com"}
    assert_response 200
  end
end

しかし、まだ API への呼び出しを行っています。

4

1 に答える 1

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なぜなら、それは render が行うことだからです。

于 2015-05-18T05:34:26.137 に答える