【问题标题】:stubs MailChimp api call for functional testing用于功能测试的存根 MailChimp api 调用
【发布时间】:2015-07-29 09:32:29
【问题描述】:

我正在尝试测试特定列表的 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。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 mailchimp ruby-mocha


    【解决方案1】:

    我习惯了 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,因为渲染就是这样做的。

    【讨论】:

    • 嗨@newmediafreak,我试过你的答案,但我得到了这个错误:test_valid_signup(SomeControllerTest): ActiveSupport::JSON::Encoding::CircularReferenceError: object references itself。我正在寻找原因。
    • 阅读此内容后:github.com/rspec/rspec-mocks/issues/78 我做了一些更改 Gibbon::API.any_instance.stubs({:EMAIL => "test_email@email.com" }).returns(lists) 但我仍在使用 MailChimp API,这就是我想要避免的……抱歉,MailChimp API 的答案延迟让我认为他的答案是正确的……
    猜你喜欢
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2011-10-08
    • 2012-05-30
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多