我一直试图找出一种测试以下代码的方法(在Elixir中):
defmacro __using__(_) do
quote do
# API functions will be used from this client
import Client.API
def list_storages do
case list_buckets do
{:ok, res} ->
case res.status_code do
200 ->
res.body
|> Friendly.find("name")
|> Enum.map(fn bucket -> bucket.text end)
_ ->
res |> show_error_message_and_code
end
{:error, reason} ->
parse_http_error reason
end
end
...
问题是list_buckets
函数是从Client.API
模块导入的(已经在另一个项目中测试过,我无法真正改变它)。我的想法是对API函数进行存根/模拟/伪操作,以便它们只返回虚拟回复。我尝试使用defoverridable
覆盖list_buckets
函数,但由于函数定义发生在另一个模块中,因此无效。
我已经阅读了JoséValim的以下post,这有助于测试Client.API模块,但我找不到将这些概念应用于此特定问题的方法。
到目前为止,我唯一的(也是愚蠢的)想法是重新实现测试文件中宏内的每个函数,并使用在那里定义的虚拟API函数,但如果非代码中有代码更改则感觉非常错误测试代码。
基本上我想测试三种可能的情况是否正确:
{:ok, res}
和代码200
- >输出正确的数据{:ok, res}
和其他代码 - >输出错误消息和代码{:error, reason}
- >解析HTTP错误并输出失败原因任何人都可以帮我吗?
答案 0 :(得分:0)
您仍然可以使用该博文中的原则。而不是导入Client.Api
将其作为最后一个变量传递给list_storages
。
def list_storages(api \\ Client.Api) do
case api.list_buckets do
这样您就不需要更改应用程序代码中的任何内容,并且可以在测试函数时传递虚拟模拟。