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

Rspec - Using variable defined in a let statement in another let statement

在我的 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:car2 中定义的 name1 的确切名称值。上面的语法抛出以下错误

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

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

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.

的值

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

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

let(:car2) do 
  {
    name2: car[:name1]
  }
end

请注意,这仅回答了您关于如何提取值的问题,我不建议您那样编写规范。如果两辆车同名,那么塞巴斯蒂安的答案可能更清晰易懂。

让定义相互配合得很好。

您定义了两个东西:car1car2。 代码抛出关于 name1 的错误。你只是没有定义它。

我想您需要阅读更多有关 ruby Hash and Symbol 的内容。