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

时间:2014-12-12 16:11:38

标签: 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

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

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

3 个答案:

答案 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)

  1. 不会发生什么事情。
  2. 你想要发生什么?&34;单元测试&#34;作为一种方法论。
  3. 让我首先解释#2 - 单元测试测试用例应该能够独立工作,这意味着它们应该在一起运行,分开运行时以任何顺序工作......以及一些单元测试框架(如中的默认框架)在 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

正如其他人所说,没有适当的单元测试方法。但是,我们应该如何知道您是否进行单元测试。所以,我不会判断。 无论如何,祝你好运,如果你有其他的解决方案!