0

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

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

测试shell,省略了繁琐的细节,如下:

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在每个测试之间实际上并没有增加。

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

这是预期的吗?处理这个问题的正确方法是什么?

4

2 回答 2

2

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

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

于 2013-09-10T20:19:44.797 回答
1

Minitest 实际上并不支持before :allRSpec 的方式。您传入的类型before do(例如:allor :each)在底层实现中被完全忽略。

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

您可以使用类变量(不是很漂亮,但它们在这里可以满足您的需求)。或者,如果您使用 Minitest::Unit,您似乎可以设置自定义运行器 - 查看文档此较旧的答案此要点以获取更多详细信息。

于 2013-08-13T14:01:53.863 回答