我怎么能模拟一个特定的api调用,类似于python请求-mock的工作原理:
with requests_mock.mock() as m:
m.get('http://test.com', text='data')
requests.get('http://test.com').text
在此示例中,对with语句内的http://test.com
的每次调用都将被模拟
所以在elixir中,例如,我有这个:
defmodule API do
# makes a call to an external API I dont want to test
def make_call do
...
end
end
defmodule Item do
alias API
# function I actually want to test
def build_request do
API.make_call
# stuff I want to test
end
end
所以,让我说我想测试build_request
嘲弄make_call
我尝试了这个包https://github.com/jjh42/mock,但是这个包的作用是覆盖整个API模块,例如使用make_call
方法的模拟,但你也失去了API模块的所有其他功能,我不这样做想要那个。
我怎么能嘲笑那个电话?
在另一个例子中,我看到了https://hashrocket.com/blog/posts/mocking-api-s-with-elixir
# mocking a github api call directly
@github_api.make_request(:get, "/users/#{username}")
但它是同一个问题,它在测试中直接嘲笑请求,我的问题是模拟需要在内部函数中完成,而不是马上完成。
答案 0 :(得分:1)
Dependency injection是你的朋友:
def build_request(caller \\ API) do
caller.make_call
# stuff I want to test
end
在测试中,您为build_request
的调用提供了一个参数:
build_request(TestAPI)
详情请参阅JoséValim的brilliant writing。