用 rspec 测试 sendwithus_ruby
Testing sendwithus_ruby with rspec
我们使用 sendwithus ruby gem 在我们的 Rails 应用程序中发送电子邮件。 (https://github.com/sendwithus/sendwithus_ruby)。如何测试使用 rspec 发送电子邮件?
嗯,我知道这里有三个选项 - 哪个是最好的将取决于您测试的具体内容以及测试环境的设置方式。
使用 rspec 模拟拦截 Sendwithus API 调用并在模拟中执行您自己的验证。
使用网络捕获库(如 VCR,https://github.com/vcr/vcr)捕获 Sendwithus gem 发出的 API 调用。然后您可以验证并断言捕获的请求是否符合您的预期。
使用 Sendwithus 测试 API 密钥并实际对您的 Sendwithus 帐户进行 API 调用。测试 API 键可以配置为从不发送电子邮件,或将所有电子邮件转发到固定的电子邮件地址。更多信息在这里:https://support.sendwithus.com/delivery/how_do_sendwithus_api_keys_work/
这是一个使用 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
我们使用 sendwithus ruby gem 在我们的 Rails 应用程序中发送电子邮件。 (https://github.com/sendwithus/sendwithus_ruby)。如何测试使用 rspec 发送电子邮件?
嗯,我知道这里有三个选项 - 哪个是最好的将取决于您测试的具体内容以及测试环境的设置方式。
使用 rspec 模拟拦截 Sendwithus API 调用并在模拟中执行您自己的验证。
使用网络捕获库(如 VCR,https://github.com/vcr/vcr)捕获 Sendwithus gem 发出的 API 调用。然后您可以验证并断言捕获的请求是否符合您的预期。
使用 Sendwithus 测试 API 密钥并实际对您的 Sendwithus 帐户进行 API 调用。测试 API 键可以配置为从不发送电子邮件,或将所有电子邮件转发到固定的电子邮件地址。更多信息在这里:https://support.sendwithus.com/delivery/how_do_sendwithus_api_keys_work/
这是一个使用 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