代码之家  ›  专栏  ›  技术社区  ›  Flame_Phoenix

如何用Mox模拟HTTPoison?

  •  0
  • Flame_Phoenix  · 技术社区  · 6 年前

    出身背景

    我有一个库,它使用HTTPoison实现一些需要测试的功能。为了实现这一点,我正在使用 Mox ,我相信这是万能的长生不老药模拟图书馆(尽管还有其他图书馆,但这一个有Jos Valim批准的印章)

    问题

    一切都很顺利,我在 test_helpers.exs :

        ExUnit.start()
        Mox.defmock(HTTPoisonMock, for: HTTPoison)
    

    我设置了我的虚拟测试:

    defmodule Alfred.Test.Http.Test do
      use ExUnit.Case, async: true
      import Mox
      # Make sure mocks are verified when the test exits
      setup :verify_on_exit!
    
      describe "get" do
        test "works on OK" do
          HTTPoisonMock
          |> get(:get, fn _ -> 1 end)
    
          assert HTTPoisonMock.get(1) == 1
        end
      end
    end
    

    这里的问题是我无法运行它们:

    模块HTTPoison不是行为,请将行为传递给:for

    模拟合同,而不是实现

    • 如何模拟不提供使用Mox行为的第三个库?
    1 回复  |  直到 6 年前
        1
  •  2
  •   Aleksei Matiushkin    6 年前

    HTTPoison uses the behaviour HTTPoison.Base ,所以在这个特殊的情况下,你们都准备好了。


    我如何模拟不提供行为的第三个库 Mox

    通常,我们通过依赖注入来实现这一点。每当需要第三方时,只需将其作为参数传递,并在测试环境中传递另一个模块/模拟。

    推荐文章