【问题标题】:Rspec - Using variable defined in a let statement in another let statementRspec - 在另一个 let 语句中使用在 let 语句中定义的变量
【发布时间】:2018-07-29 03:38:19
【问题描述】:

在我的 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 中定义的确切名称值。上面的语法引发了以下错误

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

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

【问题讨论】:

    标签: ruby rspec2


    【解决方案1】:
    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 的值。

    【讨论】:

    • 谢谢@Sebastian Palma。我现在明白了。
    【解决方案2】:

    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

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-07
        • 2015-02-26
        • 2010-10-25
        • 2017-05-29
        • 1970-01-01
        相关资源
        最近更新 更多