elixir mock内部函数url请求

时间:2018-04-02 08:39:17

标签: testing mocking elixir

我怎么能模拟一个特定的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}")

但它是同一个问题,它在测试中直接嘲笑请求,我的问题是模拟需要在内部函数中完成,而不是马上完成。

1 个答案:

答案 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