使用ExUnit测试时,如何伪造IO输入?

al_

我有一个要测试的Elixir程序,它需要IO.gets多次从用户那里获取输入我将如何在测试中伪造此输入?

注意:我想为每个返回不同的值 IO.gets

织造

首选的方法是将代码分为纯代码(无副作用)和不纯代码(做io)。因此,如果您的代码如下所示:

IO.gets
...
...
...
IO.gets
...
...

尝试将IO.gets之间的部分提取为可以独立于进行测试的功能IO.gets

def fun_to_test do
  input1 = IO.gets
  fun1(input1)
  input2 = IO.gets
  fun2(input2)
end

然后您可以单独测试功能。这并不总是最好的事情,尤其是不纯的部分是内心深处ifcasecond语句。

替代方法是将传递IO为显式依赖项:

def fun_to_test(io \\ IO) do
  io.gets
  ...
  ...
  ...
  io.gets
  ...
  ...
end

这样,您可以直接在生产代码中使用它,而无需进行任何修改,但是在测试中,您可以将其传递给其他模块fun_to_test(FakeIO)如果提示不同,则可以对gets参数进行模式匹配

defmodule FakeIO do
  def gets("prompt1"), do: "value1"
  def gets("prompt2"), do: "value2"
end

如果它们始终相同,则需要保持gets被调用多少次的状态

defmodule FakeIO do
  def start_link do
    Agent.start_link(fn -> 1 end, name: __MODULE__)
  end

  def gets(_prompt) do
    times_called = Agent.get_and_update(__MODULE__, fn state ->
      {state, state + 1}
    end)
    case times_called do
      1 -> "value1"
      2 -> "value2"
    end
  end
end

最后一个实现是一个具有内部状态的完全可用的模拟。您需要先致电FakeIO.start_link才能在测试中使用它。如果这是您需要在许多地方执行的操作,则可以考虑使用一些模拟库,但是正如您所看到的-这并不太复杂。为了FakeIO更好,您可以打印提示。我在这里跳过了这个细节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

运行混合测试时如何避免ExUnit.start()错误

来自分类Dev

Angular2+ 集成单元测试:如何使用 'keydown'-event 和 'input'-event 伪造用户在输入中输入内容

来自分类Dev

运行ExUnit测试时,如何仍将日志打印到控制台?

来自分类Dev

在ExUnit测试中使用下划线(_)

来自分类Dev

在测试环境中禁用伪造保护时,测试如何抛出InvalidAuthenticityToken?

来自分类Dev

伪造属性时如何指定要使用的类?

来自分类Dev

在没有服务器的情况下测试Ruby Rack时如何伪造文件上传?

来自分类Dev

如何模拟或伪造HttpApplication / HttpContext进行测试

来自分类Dev

如何伪造Realm结果进行测试

来自分类Dev

如何模拟或伪造HttpApplication / HttpContext进行测试

来自分类Dev

如何在测试中伪造 Popen?

来自分类Dev

如何使用伪造者dateTimeBetween创建伪造事件?

来自分类Dev

如何使用输入调用测试功能?

来自分类Dev

如何使用bundle / vec输入测试模块?

来自分类Dev

如何在 Laravel 单元测试中停止事件伪造(切换事件伪造)

来自分类Dev

如何使用MSTEST对ASP.NET CORE控制器进行单元测试并添加伪造品

来自分类Dev

测试时如何模拟文本输入onchange

来自分类Dev

使用AutoBench对大型输入进行测试时,无效标准报告

来自分类Dev

如何使用FakeItEasy伪造基类方法

来自分类Dev

如何使用CSS变换伪造宽度动画?

来自分类Dev

如何测试scalaz IO?

来自分类Dev

如何测试scalaz IO?

来自分类Dev

无法使用termios.TIOCSTI伪造终端输入

来自分类Dev

伪造IO流

来自分类Dev

伪造IO流

来自分类Dev

使用Jasmine测试时如何模拟MatChipInput

来自分类Dev

使用FragmentScenario测试片段时如何测试与菜单的交互

来自分类Dev

进行基于属性的测试时,如何在测试输入上建立条件?

来自分类Dev

进行基于属性的测试时,如何在测试输入上建立条件?

Related 相关文章

  1. 1

    运行混合测试时如何避免ExUnit.start()错误

  2. 2

    Angular2+ 集成单元测试:如何使用 'keydown'-event 和 'input'-event 伪造用户在输入中输入内容

  3. 3

    运行ExUnit测试时,如何仍将日志打印到控制台?

  4. 4

    在ExUnit测试中使用下划线(_)

  5. 5

    在测试环境中禁用伪造保护时,测试如何抛出InvalidAuthenticityToken?

  6. 6

    伪造属性时如何指定要使用的类?

  7. 7

    在没有服务器的情况下测试Ruby Rack时如何伪造文件上传?

  8. 8

    如何模拟或伪造HttpApplication / HttpContext进行测试

  9. 9

    如何伪造Realm结果进行测试

  10. 10

    如何模拟或伪造HttpApplication / HttpContext进行测试

  11. 11

    如何在测试中伪造 Popen?

  12. 12

    如何使用伪造者dateTimeBetween创建伪造事件?

  13. 13

    如何使用输入调用测试功能?

  14. 14

    如何使用bundle / vec输入测试模块?

  15. 15

    如何在 Laravel 单元测试中停止事件伪造(切换事件伪造)

  16. 16

    如何使用MSTEST对ASP.NET CORE控制器进行单元测试并添加伪造品

  17. 17

    测试时如何模拟文本输入onchange

  18. 18

    使用AutoBench对大型输入进行测试时,无效标准报告

  19. 19

    如何使用FakeItEasy伪造基类方法

  20. 20

    如何使用CSS变换伪造宽度动画?

  21. 21

    如何测试scalaz IO?

  22. 22

    如何测试scalaz IO?

  23. 23

    无法使用termios.TIOCSTI伪造终端输入

  24. 24

    伪造IO流

  25. 25

    伪造IO流

  26. 26

    使用Jasmine测试时如何模拟MatChipInput

  27. 27

    使用FragmentScenario测试片段时如何测试与菜单的交互

  28. 28

    进行基于属性的测试时,如何在测试输入上建立条件?

  29. 29

    进行基于属性的测试时,如何在测试输入上建立条件?

热门标签

归档