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_instanceGibbon::API所以我猜Gibbon::API.any_instance这至少是您需要的。除此之外,您还需要对方法listssubscribe方法进行存根。

所以,我猜这样的事情应该在你的valid signup测试用例中起作用:

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

我认为您不必 return 200,因为这就是渲染的作用。

于 2015-05-18T05:34:26.137 回答