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