- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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
然后您可以单独测试这些功能。这并不总是最好的做法,尤其是当不纯部分深藏在 if
、case
或 cond
语句中时。
另一种方法是将 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
更好,您可以打印提示。我在这里跳过了这个细节。
关于testing - 使用 ExUnit 进行测试时如何伪造 IO 输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37715885/
早上好, 我的Elixir项目中有一些特别昂贵的数据库设置代码,可将所需数据插入数据库。 我目前正在测试,这样可以通过@tag :insert_my_data构造在需要此数据之前将其插入。我的测试助手
我正在该库的 ExUnit 中测试查询(不是查询返回的数据)。 https://github.com/tanweerdev/fat_ecto 这是我的代码: test "returns the qu
我正在为我的应用程序编写测试用例,我的大部分 Controller 都包含 CRUD 的通用代码,因此我编写了通用宏并在我的 Controller 中使用它。所有 Controller 的测试用例都将
我有一个需要使用随机整数的测试用例,所以我有: test "test with random integer" do IO.inspect :random.uniform(10) a
在 Ruby 中,特别是 RSpec,您可以告诉测试运行器在第一个未通过命令行标志 --fail-fast 的测试中中止。 .这有助于避免在连续修复大量测试时浪费时间或失去焦点,例如在进行测试驱动或行
为了在失败的集成测试期间进行调试,我希望仍然能够看到我的应用程序日志。有没有我可以传递给 mix test 的命令完成这个任务? 最佳答案 每个混合项目都有一个 config.exs文件。当 mix
在 RSpec可以使用 shared_examples 创建测试并从多个位置引用它。它极大地简化了开发人员的生活。 有没有办法在 ExUnit 中使用共享示例? 最佳答案 test 宏会做一些簿记工作
我在phoenix应用程序中有以下测试: defmodule TattooBackend.Web.API.V1.PasswordControllerTest do use TattooBacken
我正在学习本教程:http://elixir-lang.org/getting-started/mix-otp/agent.html 所以在我的 Elixir 项目中,我有一个模块 lib/kv/bu
如您所知,rspec支持let在其测试中。通过预定义公共(public)变量并在测试之间共享它们,这非常有用并且可以大大缩短代码。 如何在 ExUnit 中调用此功能? ? 最佳答案 我认为使用 Ex
有没有办法检查是否已从 ExUnit 测试用例调用函数?我有一个调用 IO.puts 的函数,我想测试并验证某些内容正在通过测试用例输出到 STDOUT。 我看到了这个:http://erlang.o
我想在我的 Elixir 项目中有两组单独的单元测试,我可以使用不同的 ExUnit 配置单独运行它们。 我正在研究 ExUnit 格式化程序,我正在尝试为它编写单元测试。为了测试它,我想我会创建另一
我想测试一个函数如何改变数据库中的某些东西。我正在努力处理与以下 ActiveSupport::TestCase 测试用例等效的 ExUnit: test "creates a database re
我正在使用 ExUnit 测试我的 Elixir 应用,这是一款纸牌游戏。 我发现在我编写的每个测试中,我都是从创建一副新牌开始的。 test "Do This Crazy Thing do de
我想对输入数据和预期结果的多个手工组合重复使用测试用例的相同代码,但不复制粘贴每组代码。其他语言的框架以不同的方式支持它,例如在 Groovy/Spock 中: def "maximum of two
我正在测试函数的返回值。两者中哪一个是首选方式? test "extra verbose, using assert" do {:error, reason} = MyModule.my_fun
我的 elixir 应用程序中有一个方法,比如说 Some.Module.func/1 ,返回两个数字的元组。我正在 ExUnit 中编写测试,只需要测试元组中的第一个元素,并不真正关心第二个元素。
我正在尝试启动 IEx.pry在一次测试中。但是我无法在 iex session 中运行测试。请注意,我没有使用混合。 ExUnit.start defmodule Calc do def add
我有一个 Elixir 程序,我想测试它通过 IO.gets 多次从用户那里获取输入。我将如何在测试中伪造这个输入? 注意:我想为每个 IO.gets 返回不同的值 最佳答案 首选的方法是将您的代码分
我有一个 Phoenix 应用程序(它只是一个没有前端的 restful api),其中一个 Controller 做了一些我想测试的东西,但是在 Controller 的末尾它调用了一个调度程序,它
我是一名优秀的程序员,十分优秀!