ExVCR 使用教程
项目介绍
ExVCR 是一个受 Ruby 的 VCR 库启发的 Elixir 语言的 HTTP 请求/响应录制库。它允许开发者在测试中录制和重放 HTTP 交互,从而简化测试过程并提高测试的可重复性。ExVCR 支持多种 HTTP 客户端,如 HTTPoison 和 Tesla,并且可以与 Elixir 的测试框架无缝集成。
项目快速启动
安装 ExVCR
首先,在 mix.exs
文件中添加 ExVCR 依赖:
defp deps do
[
{:exvcr, "~> 0.15", only: :test}
]
end
然后运行以下命令来获取依赖:
mix deps.get
使用 ExVCR
在测试模块中使用 ExVCR 录制和重放 HTTP 请求。以下是一个简单的示例:
defmodule MyAppTest do
use ExUnit.Case
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
test "example test" do
use_cassette "example_cassette" do
response = HTTPoison.get!("http://example.com")
assert response.status_code == 200
end
end
end
运行测试:
mix test
应用案例和最佳实践
录制和重放外部 API 请求
假设你正在开发一个应用程序,需要与外部 API 进行交互。你可以使用 ExVCR 录制这些交互,并在测试中重放它们,以确保测试的可重复性和稳定性。
defmodule ExternalApiTest do
use ExUnit.Case
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
test "get data from external API" do
use_cassette "external_api_cassette" do
response = HTTPoison.get!("https://api.example.com/data")
assert response.status_code == 200
assert Jason.decode!(response.body)["key"] == "value"
end
end
end
处理敏感数据
在录制 HTTP 交互时,可能需要处理敏感数据(如密码或令牌)。ExVCR 提供了 filter_sensitive_data
选项来替换这些敏感数据。
config :exvcr, [
filter_sensitive_data: [
[pattern: "<PASSWORD>.*</PASSWORD>", placeholder: "PASSWORD_PLACEHOLDER"]
]
]
典型生态项目
HTTPoison
HTTPoison 是一个流行的 Elixir HTTP 客户端,与 ExVCR 兼容良好。你可以使用 ExVCR 录制和重放 HTTPoison 的请求。
defmodule HttpClientTest do
use ExUnit.Case
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
test "example test with HTTPoison" do
use_cassette "httpoison_cassette" do
response = HTTPoison.get!("http://example.com")
assert response.status_code == 200
end
end
end
Tesla
Tesla 是另一个强大的 HTTP 客户端,支持中间件和插件。ExVCR 也可以与 Tesla 集成,用于录制和重放请求。
defmodule TeslaClientTest do
use ExUnit.Case
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
test "example test with Tesla" do
use_cassette "tesla_cassette" do
client = Tesla.client([], {Tesla.Adapter.Hackney, []})
response = Tesla.get(client, "http://example.com")
assert response.status == 200
end
end
end
通过这些示例,你可以看到 ExVCR 如何与不同的 HTTP 客户端集成,以提供强大的测试支持。