【问题标题】:Assigning Variables for Programmatic Examples in Rspec在 Rspec 中为编程示例分配变量
【发布时间】:2013-03-06 02:49:45
【问题描述】:

我正在使用 Rspec 和 Selenium 设置一些自动化测试,但在尝试以编程方式创建示例时遇到了一些问题。

我有一个包含多个项目的数组,需要根据数据的更改进行多次测试。

数组:

def get_array
  @stuff = { thing1, thing2, thing3 }
end

简化版测试:

describe "My tests" do
  context "First round" do
    before { #do some stuff }

    @my_array = get_array
    @my_array.each do |k|
      it "should pass the test" do
        k.should pass_the_test
      end
    end
  end

  context "Second round" do
    before { #do some other stuff }

    @my_array = get_array
    @my_array.each do |k|
      it "should pass the test" do
        k.should pass_the_test
      end
    end
  end
end

在这个例子中还不错,但每次都必须调用@my_array = get_array 绝对不是 DRY。随着我添加更多测试和复杂性,这很快就会失控,所以我想知道我缺少什么更简单/更好的方法。

我已经尝试过共享上下文和我能找到的任何其他方法,但似乎没有任何效果。

【问题讨论】:

    标签: ruby selenium rspec


    【解决方案1】:

    阅读您的评论后,@benny-bates,我意识到问题不在于 before 块,而只是在调用测试之前初始化变量。不幸的是,看起来将您的实例变量转换为常量可能是最好的方法。

    describe "My tests" do
    
      STUFF = {thing1, thing2, thing3}
    
      context "First round" do
        before { #do some stuff }
    
        STUFF.each do |k|
          it "should pass the test" do
            k.should pass_the_test
          end
        end
      end
    
      context "Second round" do
        before { #do some other stuff }
    
        STUFF.each do |k|
          it "should pass the test" do
            k.should pass_the_test
          end
        end
      end
    end
    

    【讨论】:

    • 谢谢杰夫。那是我尝试过的事情之一,但不幸的是它似乎不起作用。如果在 it 块中使用 @stuff ,它将起作用,但如果在块之前使用它则不会。在这种情况下,我得到:“@stuff.each do”行上的“nil:NilClass (NoMethodError) 的未定义方法 `each'”
    • 再次感谢@geoff-petrie,但仍然收到相同的错误:“nil:NilClass (NoMethodError) 的未定义方法‘每个’”告诉我数组为零。我认为与您的答案匹配但返回该错误的另一个示例是:gist.github.com/benbates/5096712
    • 感谢您的要点,@benny_bates。我现在看到你的问题了。对我来说,部分挑战是测试与我过去看到的有点不同。使用 RSpec 通过迭代进行测试似乎需要您已经在做的事情。也就是说,如果您将@stuff 更改为常量STUFF,您将获得您想要的结果。
    • 不错。我什至没有想过将它用作常数。不确定这是否是最佳实践,但我认为如果我改变一些东西并尝试这条路线,我可以大大简化事情。如果您想编辑/更新您的答案,我很乐意接受它作为可能做我想做的事情的唯一方法。谢谢!
    • 另一个快速问题。它实际上似乎也可以使用全局变量。除了不改变常数之外,使用其中一种或另一种有什么危害/好处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多