如何将带有存根的Rspec测试转换为Minitest

时间:2015-03-27 07:58:00

标签: ruby rspec minitest stub

我正在尝试将测试文件从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存根一样?

1 个答案:

答案 0 :(得分:1)

我从Reddit的Chris Kottom那里得到了答案,我将在这里分享。

解决方案是使用lambda:

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

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

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

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