我想知道在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
现在,显然,这对于let不起作用,因为在新的上下文中,myvar变量将返回初始状态,即= 0。 我需要在两个上下文之间“缓存状态”的机制,这反过来会给我第二个上下文中myvar = 20的值
欢迎任何意见,建议和改进。 感谢
答案 0 :(得分:4)
另一种简单的方法是在描述上下文中定义“局部变量”。 “局部变量”将贯穿整个描述,运行期间的任何更改都会影响它,因此更改它。
例如
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
<强>输出强>
1
2
1
答案 1 :(得分:2)
让我首先解释#2 - 单元测试测试用例应该能够独立工作,这意味着它们应该在一起运行,分开运行时以任何顺序工作......以及一些单元测试框架(如elixir中的默认框架)在 parallel 中运行测试用例......
对于#1 - 当您编写myvar = 20
时,您没有为let(:myvar) { @myvar = 0 }
分配值,您只需创建一个本地变量,它将覆盖对{的所有调用方法内{1}}但在之外该方法(myvar
将返回myvar
)。
即使您已设置0
(除非您之前首次致电@myvar = 20
),myvar
仍会返回{ {1}},因为myvar
函数使用 memento 模式,这意味着它被调用一次,后续调用返回最初返回的值(在本例中为0
):
let
答案 2 :(得分:0)
我刚遇到同样的问题。我如何解决它是通过使用factory_girl gem。
以下是基础知识:
创建工厂:
require 'factory_girl'
require 'faker' # you can use faker, if you want to use the factory to generate fake data
FactoryGirl.define do
factory :generate_data, class: MyModule::MyClass do
key 100 # doesn't matter what you put here, it's just a placeholder for now
another_key 'value pair'
end
end
现在你出厂后需要制作一个如下所示的模型:
Module MyModule
class MyClass
#for every key you create in your factory you must have a corresponding attribute accessor in the model.
attr_accessor :key, :another_key
#you can also place methods here to call from your spec test, if you wish
# def self.test
#some test
# end
end
end
现在回到你的例子,你可以这样做:
describe "My test" do
let(:myvar) { @myvar }
context "First test pass" do
it "passes" do
@myvar.key = 20 #when you do this you set it now from 100 to 20
expect(@myvar.key).to eq(20)
end
end
context "Second test pass" do
it "passes" do
expect(@myvar.key).to eq(20) #it should still be 20 unless you overwrite that variable
end
end
end
正如其他人所说,没有适当的单元测试方法。但是,我们应该如何知道您是否进行单元测试。所以,我不会判断。 无论如何,祝你好运,如果你有其他的解决方案!