在多个上下文之间传递变量的rspec方式

Bak*_*vic 4 ruby rspec rspec2

我想知道在 rspec 中的多个上下文(或多个它的)之间传递变量但不使用全局变量的最佳方法是什么?

例如,我有这个:

describe "My test" do
    let(:myvar) { @myvar = 0 }

    context "First test pass" do
        it "passes" do
            myvar = 20
            expect(myvar).to eq(20)
        end
    end

    context "Second test pass" do
        it "passes" do
            expect(myvar).to eq(20)
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

现在,显然,这不适用于 let 因为有了新的上下文,myvar 变量将回到初始状态,即 = 0。我需要在两个上下文之间“缓存状态”的机制,这反过来又会给我 myvar = 的值20 在第二种情况下

欢迎任何意见、建议和改进。谢谢

小智 6

另一种简单的方法是在描述上下文中定义一个“局部变量”。“局部变量”将存在于整个描述中,运行时的任何更改都会影响它,因此会更改它。

例如

describe 'tests' do
    context 'Sharing a variable across tests' do
        var = 1
        puts var

        it "it one. var = #{var}" do
            var = var*2
            puts var
        end
        it "it two" do
            puts var
        end
    end
end 
Run Code Online (Sandbox Code Playgroud)

输出

1
2
1
Run Code Online (Sandbox Code Playgroud)


Uri*_*ssi 2

  1. 发生的事情并不是你想象的那样。
  2. 你想要发生的事情打破了“单元测试”作为一种方法。

首先让我解释#2 - 单元测试测试用例应该能够独立工作,这意味着它们应该在一起运行、分开运行以及以任何顺序运行时都可以工作......以至于一些单元测试框架(例如中的默认测试用例)并行运行测试用例...

至于#1 - 当您编写时,myvar = 20您没有为 赋值let(:myvar) { @myvar = 0 },您只需创建一个局部变量,它将覆盖方法内的所有调用,但在方法外部myvar不可用(将返回)。myvar0

即使您已经设置(除非您在第一次调用之前@myvar = 20执行此操作),仍然会返回,因为该函数使用备忘录模式,这意味着它被调用一次,后续调用将返回最初返回的值(在这种情况下):myvarmyvar0let0

puts myvar
@myvar = 20
puts myvar

# => 0
# => 0
Run Code Online (Sandbox Code Playgroud)