gpt4 book ai didi

Mox 库错误 : module Myapp. MyModule 不是一种行为,请将行为传递给:for

转载 作者:行者123 更新时间:2023-12-04 01:38:31 25 4
gpt4 key购买 nike

我正在尝试在我的 Elixir 项目中使用名为 Mox 的模拟库,但即使遵循官方文档:
https://hexdocs.pm/mox/Mox.html

我无法为我的模块函数定义新的行为。尝试运行测试时出现以下错误:

** (ArgumentError) module Myapp.MyModule is not a behaviour, please pass a behaviour to :for (mox) lib/mox.ex:210: Mox.validate_behaviour!/1 (mox) lib/mox.ex:198: Mox.defmock/2 (elixir) lib/code.ex:376: Code.require_file/2 (elixir) lib/enum.ex:678: Enum."-each/2-lists^foreach/1-0-"/2 (elixir) lib/enum.ex:678: Enum.each/2



这是我到目前为止所尝试的:

test_helper.exs:
ExUnit.start()
Mox.defmock(Myapp.MockMyModule, for: Myapp.MyModule)

MyModuleTest.exs
defmodule MyModuleTest do
use ExUnit.Case

import Mox

setup :verify_on_exit!

test "Test status processor in transit with mocked result" do

Myapp.MyModule
|> expect (:put_calculated_eta, fn body, shipment_id, authorization_key -> {:ok, "bla", 200} end)

map = #Some data that fits the function interface

assert {:ok, "bla", 200} == Myapp.MyModule.update_shipment_eta(map)
end
end

我认为最奇怪的是,在文档中它确实希望通过模块进行模拟,但在错误中它要求行为(我猜应该是函数,我已经尝试过但没有成功......谁能告诉我为什么不能 mock 我的模块?

只是为了澄清,这个模拟是针对外部 api 的响应。

如果我没有提供足够的信息,请告诉我。

最佳答案

正如错误消息所传达的那样,缺少的是行为。 Elixir Behaviors(注意英式拼写)类似于强类型 OOP 语言中的“接口(interface)”;也就是说,它们描述了一组其他模块实现的功能。

例如,此模块使用单个回调方法定义行为,do_work/1 ,它需要一个整数形式的作业,并返回 {:ok, result} , 或 {:error, reason} :

defmodule WorkBehavior do
@callback do_work(job::integer) :: {:ok, integer} | {:error, atom}
end

这些模块实现了这种行为:
defmodule LazyWorker do
@behaviour WorkBehavior
@impl WorkBehavior
def do_work(job), do: {:error, :too_tired}
end

defmodule HardWorker do
@behaviour WorkBehavior
@impl WorkBehavior
def do_work(job), do: {:ok, job + 42}
end

行为的最终目标是允许您编写模块化代码,其中可以轻松交换各种实现。使用上面的代码,worker 模块可以作为参数传递,而不是硬编码。比较:
def closely_coupled do
HardWorker.do_work(12)
end

对比
def loosely_coupled(worker) do
worker.do_work(12)
end

Mox 要求您做的是定义一个捕获 MyApp.MyModule 的 API 的行为。 ,以便 Mox 可以创建一个假版本供您进行测试。 this post 中解释了这种方法的动机,而不是更典型的动态模拟。何塞·瓦利姆着。

在没有看到 MyApp.MyModule 的代码的情况下,我无法确切告诉您要编写什么代码,但总的来说,您应该添加 @callback为您希望能够模拟的每种方法添加标签。见 this page有关 typespec 和行为的介绍(提示: @callback 标签使用 typespec 语法,因此请阅读整个页面)。

关于Mox 库错误 : module Myapp. MyModule 不是一种行为,请将行为传递给:for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com