Elixir Mox 库测试 Phoenix 代码——在一些测试文件中没有 Mox 期望
Elixir Mox library testing Phoenix code - with no Mox expectations in some test files
TL;DR
不相关的测试失败,因为在使用 Mox 库时“没有定义预期”,stub_with/2
似乎没有任何帮助
详情:
有 Recaptcha 库
https://github.com/samueljseay/recaptcha
这有助于我验证 recaptcha 响应。一切都很好。测试时间到了(是的,在让代码以某种方式工作之后——向所有 TDD 粉丝致歉)。显然我不想用我的测试打叔叔google,所以:
Mox.defmock(MyApplication.Accounts.MockRecaptcha, for: MyApplication.Accounts.RecaptchaBehaviour)
里面 test_helper.ex
。需要单独定义该行为:
defmodule MyApplication.Accounts.RecaptchaBehaviour do
@callback verify(String.t(), Keyword.t()) :: {:ok, Response.t()} | {:error, [atom]}
@callback verify(String.t()) :: {:ok, Response.t()} | {:error, [atom]}
end
使用以下方法进行一些测试:
MyApplication.Accounts.MockRecaptcha
|> expect(:verify, fn _response -> {:ok, _response} end)
到目前为止一切顺利,除了...所有其他测试现在都失败了:
** (Mox.UnexpectedCallError) no expectation defined for MyApplication.Accounts.MockRecaptcha.verify/1 in process #PID<0.854.0> with args [nil]
阅读我发现的优秀文档:“[...]当没有定义预期时,您可能希望实现回退到存根(或实际)实现。stub_with/2
正是您所需要的!"
所以 test_helper.ex
中的另一行:
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, Recaptcha)
那行不通,因为 ** (ArgumentError) Recaptcha does not implement any behaviour
,嗯..让我们添加我自己的“代理”,这样就可以了:
defmodule MyApplication.Accounts.Recaptcha do
@behaviour MyApplication.Accounts.RecaptchaBehaviour
def verify(response, options \ []) do
Recaptcha.verify(response, options)
end
end
并将 test_helper.ex
行更改为
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, MyApplication.Accounts.Recaptcha)
现在 ArgumentError
消失了,但是所有没有 Mox 期望的测试都像以前一样失败了。使用和不使用 stub_with/2
.
没有变化
而且我觉得我已经花了太多时间...:-( 有什么帮助可以让我走上正轨吗?
更新:
根据评论中的要求,失败的测试例如控制器测试:
describe "guest GET /signup" do
setup do
System.put_env("RECAPTCHA_SITE_KEY", "123")
{:ok, conn: get(build_conn(), "/signup")}
end
test "returns HTTP_OK", %{conn: conn} do
assert response(conn, 200)
end
test "invokes UserView", %{conn: conn} do
assert Phoenix.Controller.view_module(conn) == MyApplication.UserView
end
test "renders into guest layout", %{conn: conn} do
assert Phoenix.Controller.layout(conn) == {MyApplication.LayoutView, :guest_layout}
end
test "renders 'new' template", %{conn: conn} do
assert Phoenix.Controller.view_template(conn) == "new.html"
end
end
是的,由于正在生成请求,他们(不必要地)“触摸”了 Recaptcha,这是另一回事,“解决方案”不是让他们在 Recaptcha 周围走动,而是让 stub_with/2
做它的工作。
因为 discussed on Elixir Forum stub_with/2
不能像 e. G。来自 test_helper.ex
。它只能在 setup
中或直接在测试中调用。
TL;DR
不相关的测试失败,因为在使用 Mox 库时“没有定义预期”,stub_with/2
似乎没有任何帮助
详情:
有 Recaptcha 库
https://github.com/samueljseay/recaptcha
这有助于我验证 recaptcha 响应。一切都很好。测试时间到了(是的,在让代码以某种方式工作之后——向所有 TDD 粉丝致歉)。显然我不想用我的测试打叔叔google,所以:
Mox.defmock(MyApplication.Accounts.MockRecaptcha, for: MyApplication.Accounts.RecaptchaBehaviour)
里面 test_helper.ex
。需要单独定义该行为:
defmodule MyApplication.Accounts.RecaptchaBehaviour do
@callback verify(String.t(), Keyword.t()) :: {:ok, Response.t()} | {:error, [atom]}
@callback verify(String.t()) :: {:ok, Response.t()} | {:error, [atom]}
end
使用以下方法进行一些测试:
MyApplication.Accounts.MockRecaptcha
|> expect(:verify, fn _response -> {:ok, _response} end)
到目前为止一切顺利,除了...所有其他测试现在都失败了:
** (Mox.UnexpectedCallError) no expectation defined for MyApplication.Accounts.MockRecaptcha.verify/1 in process #PID<0.854.0> with args [nil]
阅读我发现的优秀文档:“[...]当没有定义预期时,您可能希望实现回退到存根(或实际)实现。stub_with/2
正是您所需要的!"
所以 test_helper.ex
中的另一行:
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, Recaptcha)
那行不通,因为 ** (ArgumentError) Recaptcha does not implement any behaviour
,嗯..让我们添加我自己的“代理”,这样就可以了:
defmodule MyApplication.Accounts.Recaptcha do
@behaviour MyApplication.Accounts.RecaptchaBehaviour
def verify(response, options \ []) do
Recaptcha.verify(response, options)
end
end
并将 test_helper.ex
行更改为
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, MyApplication.Accounts.Recaptcha)
现在 ArgumentError
消失了,但是所有没有 Mox 期望的测试都像以前一样失败了。使用和不使用 stub_with/2
.
而且我觉得我已经花了太多时间...:-( 有什么帮助可以让我走上正轨吗?
更新:
根据评论中的要求,失败的测试例如控制器测试:
describe "guest GET /signup" do
setup do
System.put_env("RECAPTCHA_SITE_KEY", "123")
{:ok, conn: get(build_conn(), "/signup")}
end
test "returns HTTP_OK", %{conn: conn} do
assert response(conn, 200)
end
test "invokes UserView", %{conn: conn} do
assert Phoenix.Controller.view_module(conn) == MyApplication.UserView
end
test "renders into guest layout", %{conn: conn} do
assert Phoenix.Controller.layout(conn) == {MyApplication.LayoutView, :guest_layout}
end
test "renders 'new' template", %{conn: conn} do
assert Phoenix.Controller.view_template(conn) == "new.html"
end
end
是的,由于正在生成请求,他们(不必要地)“触摸”了 Recaptcha,这是另一回事,“解决方案”不是让他们在 Recaptcha 周围走动,而是让 stub_with/2
做它的工作。
因为 discussed on Elixir Forum stub_with/2
不能像 e. G。来自 test_helper.ex
。它只能在 setup
中或直接在测试中调用。