我正在为基于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
虽然可能,但这可能不是一个好主意。:)
before :all
。传递到before do
中的类型(如:all
或:each
)在底层实现中被完全忽略。
有关讨论,请参阅此问题,并注意文档指定:"类型被忽略,只是为了使移植更容易。"
您可以使用类变量(不美观,但它们可以满足您的需求)。或者,如果你使用Minitest::Unit,看起来你可以设置一个自定义的runner-查看文档,这个旧的答案,以及这个要点来了解更多细节。