【问题标题】:How to convert an Rspec test with stubs to Minitest如何将带有存根的 Rspec 测试转换为 Minitest
【发布时间】:2015-03-27 07:58:00
【问题描述】:

我正在尝试将一个测试文件从 Rspec 转换为 Minitest,到目前为止,这一切进展顺利(到目前为止非常简单的测试)。但是我遇到了一些存根,我无法让它们正常工作。

这是原始的 Rspec 测试:

it "takes exactly 1 second to run a block that sleeps for 1 second (with stubs)" do
    fake_time = @eleven_am
    Time.stub(:now) { fake_time }
    elapsed_time = measure do
        fake_time += 60  # adds one minute to fake_time
    end
    elapsed_time.should == 60
end

我尝试将其转换为 Minitest:

it "takes exactly 1 second to run a block that sleeps for 1 second (with stubs)" do
    fake_time = @eleven_am
    Time.stub(:now, fake_time) do
        elapsed_time = measure { fake_time += 60 }
        elapsed_time.must_equal 60
    end
end

以及这些正在测试的方法:

def measure(rep=1, &block)
    start_time = Time.now
    rep.times { block.call }
    Time.now - start_time
end

我遇到的问题是,使用 Rspec,存根会随着方法的执行而动态更新。当 fake_time 在块中发生更改时,Time.now 会立即更新以与之对应,这意味着在我的方法中更新了最终的 Time.now 调用,并返回适当的差异 (60)。

使用 Minitest,我似乎成功地覆盖了 Time.now 响应,但它不会随着执行而更新,所以当 fake_time 得到调整时,Time.now 不会。这会导致它始终返回 0,因为 start_timeTime.now 保持相同。

这可能是正确的行为,我只是不确定如何从中得到我想要的。

如何使 Minitest 存根像 Rspec 存根一样工作?

【问题讨论】:

    标签: ruby rspec minitest stub


    【解决方案1】:

    我在 Reddit 上收到了 Chris Kottom 的回复,我将在这里分享。

    解决方案是使用 lambda:

    Time.stub(:now, -> { fake_time }) do
        ...
    end
    

    这会创建一个动态存根,该存根会随着您的代码执行而更新。

    如果fake_time 是变量而不是方法(例如静态与动态),您可以通过以下方式表示:

    Time.stub(:now, fake_time) do
        ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多