0

我们使用 sendwithus ruby​​ gem 在我们的 Rails 应用程序中发送电子邮件。(https://github.com/sendwithus/sendwithus_ruby)。如何测试使用 rspec 发送电子邮件?

4

2 回答 2

3

这是一个使用 vcr 库的测试。不漂亮,但有效。分享您对如何改进它的想法。

用于测试的 Ruby 包装器:

class TestWithUs

  CASSETTES_PATH = 'fixtures/vcr_cassettes/'

  def initialize(name)
    @name = name
    @cassette_file = get_cassette_file(name)
  end

  def track(&block)
    File.delete(@cassette_file) if File.exist?(@cassette_file)
    VCR.use_cassette(@name) do
      block.call
    end
  end

  def results
    YAML.load(File.read @cassette_file)["http_interactions"]
  end

  private

  def get_cassette_file(name)
    CASSETTES_PATH + name + ".yml"
  end

end

测试文件:

require 'spec_helper'
require 'vcr'

VCR.configure do |config|
  config.cassette_library_dir = "fixtures/vcr_cassettes"
  config.hook_into :webmock
  #config.ignore_request { |r| r.uri =~ /localhost:9200/ }
  config.ignore_localhost = true
end

describe 'messages sent to matt' do
  before do
    @test_with_us = TestWithUs.new("welcome_email")
    @test_with_us.track do

      # Usually it sends email on some kind of callback,
      # but for this example, it's straightforward

      SENDWITHUS.send_with(CONFIG.swu_emails[:welcome],
        { address: "user@example.com" },
        {company_name: 'Meow Corp'})
    end
  end

  it "Sends an email" do
    sendwithus_calls = @test_with_us.results.select {|c| c["request"]["uri"] == "https://api.sendwithus.com/api/v1/send"}
    expect(sendwithus_calls.count).to eq(1)
  end
end
于 2015-12-17T22:14:14.713 回答
2

嗯,我知道这里有三个选项 - 哪个最好取决于您正在测试的具体内容以及您的测试环境是如何设置的。

  1. 使用 rspec 模拟拦截 Sendwithus API 调用并在模拟中执行您自己的验证。

  2. 使用网络捕获库(如 VCR,https://github.com/vcr/vcr)来捕获由 Sendwithus gem 进行的 API 调用。然后,您可以验证并断言捕获的请求与您预期的一样。

  3. 使用 Sendwithus 测试 API 密钥并实际对您的 Sendwithus 帐户进行 API 调用。可以将测试 API 密钥配置为从不发送电子邮件,或将所有电子邮件转发到固定的电子邮件地址。更多信息: https: //support.sendwithus.com/delivery/how_do_sendwithus_api_keys_work/

于 2015-12-17T19:59:41.130 回答