我想知道在 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)
首先让我解释#2 - 单元测试测试用例应该能够独立工作,这意味着它们应该在一起运行、分开运行以及以任何顺序运行时都可以工作......以至于一些单元测试框架(例如Elixir中的默认测试用例)并行运行测试用例...
至于#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)
| 归档时间: |
|
| 查看次数: |
5413 次 |
| 最近记录: |