1

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その仕事をさせることです。

4

1 に答える 1