首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Elixir Mox库测试Phoenix代码-在一些测试文件中没有对Mox的期望

Elixir Mox库测试Phoenix代码-在一些测试文件中没有对Mox的期望
EN

Stack Overflow用户
提问于 2021-09-30 20:56:46
回答 1查看 157关注 0票数 1

TL;DR

不相关的测试会失败,因为在使用Mox库时“没有定义期望”,而stub_with/2似乎没有任何帮助

详细信息:

有一个Recaptcha库

https://github.com/samueljseay/recaptcha

这有助于我验证recaptcha响应。一切都很好。测试时间到了(是的,在以某种方式让代码工作之后-向所有TDD粉丝道歉)。显然,我不想用我的测试来打击谷歌大叔,所以:

代码语言:javascript
复制
Mox.defmock(MyApplication.Accounts.MockRecaptcha, for: MyApplication.Accounts.RecaptchaBehaviour)

test_helper.ex内部。需要单独定义该行为:

代码语言:javascript
复制
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

使用以下命令执行一些测试:

代码语言:javascript
复制
MyApplication.Accounts.MockRecaptcha
|> expect(:verify, fn _response -> {:ok, _response} end)

到目前为止一切顺利,除了..。所有其他测试现在都失败了,原因是:

代码语言:javascript
复制
** (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中的另一行

代码语言:javascript
复制
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, Recaptcha)

那不管用,因为** (ArgumentError) Recaptcha does not implement any behaviour,嗯..然后让我们添加我自己的“代理”,它完成以下操作:

代码语言:javascript
复制
defmodule MyApplication.Accounts.Recaptcha do
    @behaviour MyApplication.Accounts.RecaptchaBehaviour

    def verify(response, options \\ []) do
        Recaptcha.verify(response, options)
    end
end

并将test_helper.ex行更改为

代码语言:javascript
复制
Mox.stub_with(MyApplication.Accounts.MockRecaptcha, MyApplication.Accounts.Recaptcha)

现在ArgumentError消失了,但所有没有Mox预期的测试都会像以前一样失败。使用和不使用stub_with/2都没有变化。

我觉得我已经花了太多的时间在这上面...:-(有没有帮助我走上正轨?

更新:

根据注释中的要求,失败的测试是例如控制器测试:

代码语言:javascript
复制
    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做它的工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-06 11:55:35

As discussed on Elixir Forum stub_with/2不能像test_helper.ex那样被称为“全局”。它只能在setup中调用,或者直接在测试中调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69398742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档