在MiniTest的before:each子句中增加一个实例变量



我正在为基于web的API编写Ruby包装器,每个请求都需要一个唯一的事务ID与请求一起发送。

我已经使用MiniTest::Spec编写了一个测试shell,但是事务id在每个测试之间并没有递增。

测试外壳省略了繁琐的细节,如下所示:

describe "should get the expected responses from the server" do
  before :all do
    # random number between 1 and maxint - 100
    @txid = 1 + SecureRandom.random_number(2 ** ([42].pack('i').size * 8 - 2) - 102)
    @username = SecureRandom.urlsafe_base64(20).downcase
  end
  before :each do
    # increment the txid
    @txid += 1
    puts "new txid is #{@txid}"
  end
  it "should blah blah" do
    # a test that uses @txid
  end
  it "should blah blah blah" do
    # a different test that uses the incremented @txid
  end
end

然而,其中的puts行显示,@txid实际上并没有在每个测试之间递增。

更多的测试表明,在测试主体中,任何对实例变量的值赋值都不会对变量的值产生影响。

这是意料之中的事吗?正确的处理方法是什么?

Minitest在测试类的单独实例中运行每个测试。因此,测试之间不共享实例变量。要在测试之间共享值,可以使用全局变量或类变量。

describe "should get the expected responses from the server" do
  before do
    # random number between 1 and maxint - 100
    @@txid ||= SecureRandom.random_number(2 ** ([42].pack('i').size * 8 - 2) - 102)
    @@txid += 1 # increment the txid
    puts "new txid is #{@txid}"
    @@username ||= SecureRandom.urlsafe_base64(20).downcase
  end
  it "should blah blah" do
    # a test that uses @@txid
  end
  it "should blah blah blah" do
    # a different test that uses the incremented @@txid
  end
end

虽然可能,但这可能不是一个好主意。:)

Minitest实际上并不像RSpec那样支持before :all。传递到before do中的类型(如:all:each)在底层实现中被完全忽略。

有关讨论,请参阅此问题,并注意文档指定:"类型被忽略,只是为了使移植更容易。"

您可以使用类变量(不美观,但它们可以满足您的需求)。或者,如果你使用Minitest::Unit,看起来你可以设置一个自定义的runner-查看文档,这个旧的答案,以及这个要点来了解更多细节。

相关内容

  • 没有找到相关文章

最新更新