【问题标题】:How to use meck in different ExUnit test file如何在不同的 ExUnit 测试文件中使用 meck
【发布时间】:2015-10-22 11:30:19
【问题描述】:

我想在不同的ExUnit 测试文件中使用meck

例如,

[x_test.exs]

def setup do
  :meck.new(Hoge, [:passthrough])
 on_exit(fn -> :meck.unload end)
 :ok
end

def teardown do
  :meck.unload
end

test "foo" do
  :meck.expect(Hoge, :foo, fn -> 1 end)
  assert Hoge.foo == 1
end

[y_test.exs]

def setup do
  :meck.new(Hoge, [:passthrough])
 on_exit(fn -> :meck.unload end)
 :ok
end

def teardown do
  :meck.unload
end

test "foo" do
  :meck.expect(Hoge, :foo, fn -> 2 end)
  assert Hoge.foo == 2
end

有时,x_test.exs 失败,但有时,x_test.exs 成功...... (y_test.exs 相同)

我可以在另一个测试文件中使用模拟来实现相同的功能吗?

【问题讨论】:

    标签: erlang elixir meck


    【解决方案1】:

    meck 目前正在编译和加载您用期望指定的代码。由于只有一个 当前 版本的代码可以加载到梁中,因此您应该执行所有按顺序竞争相同模拟函数的测试。

    由于 ExUnit 文档指出 测试用例 是并行执行的,因此您可能必须将所有应该在单个测试用例(即单个测试模块)中串行执行的测试合并。

    或者,您可以将可以并行执行的测试用例数量设置为 1。但是这可能会减慢您的测试运行速度

    ExUnit 支持以下选项:

    • :max_cases - 并行运行的最大案例数;默认为:erlang.system_info(:schedulers_online)

    【讨论】:

    • 谢谢!我知道测试用例是并行执行的。因此,我尝试在每个测试用例中调用“meck.new”。 (不调用设置)在这种情况下,测试没有失败。
    • @user4252489 您在此处的资源(代码)上获得了经典的竞争条件。您必须同步,否则您的测试将不可靠。在每个测试中调用 meck:new 是不够的
    • 感谢您的回复。 > 您可以在此处获得资源(代码)的经典竞争条件。您必须 > 同步,否则您的测试将不可靠。在 > > 每个测试中调用 meck:new 是不够的哦... > 或者完全绕过模拟我想模拟 System.cmd ...我尝试使用 exunit 的“异步”选项。但是,失败了..
    猜你喜欢
    • 2017-04-09
    • 1970-01-01
    • 2021-09-28
    • 2019-11-20
    • 2019-11-24
    • 1970-01-01
    • 2020-03-20
    • 2016-10-09
    • 2019-03-24
    相关资源
    最近更新 更多