如何将带有存根的 Rspec 测试转换为 Minitest
How to convert an Rspec test with stubs to Minitest
我正在尝试将测试文件从 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
调用在我的方法中更新,并且 return 是适当的差异 (60).
使用 Minitest,我似乎成功覆盖了 Time.now
响应,但它不会随着执行而更新,因此当 fake_time
得到调整时,Time.now
不会。这导致它总是 return 0,因为 start_time
和 Time.now
保持相同。
这可能是正确的行为,我只是不确定如何从中得到我想要的东西。
如何使 Minitest 存根像 Rspec 存根一样运行?
我在 Reddit 上收到了 Chris Kottom 的回答,我将在这里分享。
解决方案是使用 lambda:
Time.stub(:now, -> { fake_time }) do
...
end
这会创建一个随代码执行而更新的动态存根。
如果 fake_time
是变量而不是方法(例如静态与动态),您可以通过以下方式表示:
Time.stub(:now, fake_time) do
...
end
我正在尝试将测试文件从 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
调用在我的方法中更新,并且 return 是适当的差异 (60).
使用 Minitest,我似乎成功覆盖了 Time.now
响应,但它不会随着执行而更新,因此当 fake_time
得到调整时,Time.now
不会。这导致它总是 return 0,因为 start_time
和 Time.now
保持相同。
这可能是正确的行为,我只是不确定如何从中得到我想要的东西。
如何使 Minitest 存根像 Rspec 存根一样运行?
我在 Reddit 上收到了 Chris Kottom 的回答,我将在这里分享。
解决方案是使用 lambda:
Time.stub(:now, -> { fake_time }) do
...
end
这会创建一个随代码执行而更新的动态存根。
如果 fake_time
是变量而不是方法(例如静态与动态),您可以通过以下方式表示:
Time.stub(:now, fake_time) do
...
end