首页 文章

Rspec - 在另一个let语句中使用let语句中定义的变量

提问于
浏览
3

在我的RSpec测试中,我使用let()语法定义了多个方法 . 我遇到过一个场景,我需要将let语句中定义的变量用于同一个describe块中的另一个let语句 .

context 'Reuse the name of first car in the second car' do
    it_behaves_like 'some car test' do

      let(:car1) do {
          name1: "#{testcase['Car']}_#{Time.now.round}",
          car_model: testcase['Toyota']
      }

      end

      let(:car2) do {
          name2: name1
      }
      end
    end
  end

正如你所看到的,我想使用我在 :car1 里面为 name2 定义 name1 的确切名称值 :car2 . 上面的语法引发了以下错误

NameError:
       undefined local variable or method `name1' for #<RSpec::

如何在 :car2 中使用 name1 的精确值?有任何想法吗..

3 回答

  • 2
    let(:name1) { "#{testcase['Car']}_#{Time.now.round}" }
    
    let(:car1) { { name1: name1, car_model: testcase['Toyota'] } }
    
    let(:car2) { { name2: name1 } }
    

    所以 name1 现在也是一个惰性变量,在被调用时初始化,如果不是car1,那么对于car2 .

    如果Time.now有问题,可以将name1的值保留为 testcase['Car'] ,然后只插入Time.now的值 .

  • 0

    name1 是定义为 car1 的哈希中的键,因此您需要使用哈希语法来获取其值:

    let(:car1) do 
      {
        name1: "#{testcase['Car']}_#{Time.now.round}",
        car_model: testcase['Toyota']
      }
    end
    
    let(:car2) do 
      {
        name2: car[:name1]
      }
    end
    

    请注意,这只回答了关于如何提取值的问题,我不建议编写类似的规范 . 如果两辆车的名称相同,那么塞巴斯蒂安的回答可能更清晰,更容易理解 .

  • 3

    让定义相互配合 .

    你定义了两件事: car1car2 . 代码抛出了关于 name1 的错误 . 你刚刚没有定义它 .

    我想你需要阅读更多关于ruby HashSymbol的信息 .

相关问题