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

时间:2018-07-29 03:38:19

标签: ruby rspec2

在我的RSpec测试中,我使用let()语法定义了多种方法。我遇到了一种情况,我需要在一个let语句内使用定义的变量,将其用作同一describe块内的另一个let语句。

 git add -A
warning: adding embedded git repository: Part Project Manager
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint:   git submodule add <url> Part Project Manager
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint:   git rm --cached Part Project Manager
hint:
hint: See "git help submodule" for more information.

如您所见,我想使用 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 name1:car1内定义的name2的确切名称值。上面的语法使我产生以下错误

:car2

如何在NameError: undefined local variable or method `name1' for #<RSpec:: 中使用name1的确切值?任何想法。

3 个答案:

答案 0 :(得分:3)

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的值。

答案 1 :(得分:2)

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

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

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

请注意,这仅回答您有关如何提取值的问题,我不建议编写此类规范。如果两辆车都应使用相同的名称,那么塞巴斯蒂安的答案可能更清晰,更容易理解。

答案 2 :(得分:0)

让定义相互配合很好。

您定义了两件事:car1car2。 代码抛出关于name1的错误。您只是没有定义它。

我想您需要阅读有关红宝石HashSymbol的更多信息。