如何使用Ministest / TestCase测试外部请求超出控制器范围

时间:2016-05-16 21:04:08

标签: ruby-on-rails unit-testing mocking minitest stub

我特别喜欢Minitest,目前一切正常,因为不是很难学,但是,我坚持使用常规测试:测试将文件上传到S3的控制器。

目标: 进行测试,使用其文件创建一个新的Person.create()对象,在这种情况下是带有一些图像的zip。

背景:

  • 我的模型Person带有一个带有Paperclip的file字段及其S3配置。
  • 我有各种测试文件(当然在测试/模型和测试/控制器中),但是,在另一个文件夹中再测试一次,因为我正在测试使用Person对象更新它的其他类。

我的问题是我在Google和StackOverflow中尝试了很多方法搜索,但我不确定如何在Controller范围内解决这些测试。

require 'test_helper'
  require 'webmock/minitest'

  class PersonPhotosUpdateTest < ActiveSupport::TestCase
    def setup
      # some setup here
    end

    describe "My tests" do
      test "Upload a zip file for Person" do 
        # My test here
      end
    end
  end

我想参加我的测试:

  • 使用post :create创建新人员。
  • 应该使用上传到S3的文件创建人员。
  • 断言文件已上传到S3。

我想我需要模拟和/或存根,但我不确定Minitest是怎么做的。

谢谢。

1 个答案:

答案 0 :(得分:1)

您可能想要创建一个i ntegration test

require 'test_helper'
require 'webmock/minitest'

class LocationImporterTest < ActionDispatch::IntegrationTest
  before do
    stub_request(:any, "https://s3.amazonaws.com")
  end

  test "create" do
    post "/foo", { 
      # params...
    }

    assert_requested :post, "https://s3.amazonaws.com",
      :headers => {'Content-Length' => 3}, 
       :body => "abc",
      :times => 1    # ===> Success
  end
end

有关如何设置HTTP请求的期望,请参阅webmock documents,注意Test / Unit和Minitest是可互换的。