RSpec - 处理方法/类之外的变量

时间:2015-11-11 01:26:37

标签: ruby rspec

我的任务是将RSpec应用于我编写的旧代码而不更改/更新代码(这对我而言似乎与TDD的观点相反)。

无论如何,我很难找到一种允许RSpec访问放在类和方法之外的变量的方法。

我的原始代码是一个hacky Caesar Cipher:

puts 'Please enter your string to be coded'
    string = gets.chomp.split("")

puts 'Please enter your number key'
    key = gets.chomp.to_i

    if (key > 26) 
        key = key % 26
    end

    string.map! do |i|
        i.ord
    end

    string.map! {|i| i = i + key}.map! {|i| 
        if (i > 122)
            then i = i - 26
        elsif (90 < i && i < 97)
            then i = i - 26
        elsif (i > 96 && (i - key) < 91 && (i - key) > 64)
            then i = i - 26
        elsif (i < 65 )
            then i = 32
        else
            i
        end
    }

    string.map! do |i|
        i.chr 
    end

    puts "Your coded word is #{string.join("")}"

我正在尝试编写RSpec测试来访问stringkey变量,以便对它们进行测试。但是,我很难找到一种方法,因为它们没有在方法中定义。我见过的几乎所有RSpec示例都显示了如何在方法中访问变量:

describe "foo string" do
  it "is equal to another string of the same value" do
    expect("foo string").to eq("foo string")
  end
end

有没有办法使用RSpec来测试方法/类之外的变量?我完全错了吗?

1 个答案:

答案 0 :(得分:1)

您遇到此问题是因为您的代码是程序性的。在这种特殊情况下,您发布的整个脚本似乎充当单个函数,从STDIN获取输入并输出到STDOUT。

您应该测试脚本的输出,而不是变量。确保输出符合预期,间接测试用于测试结果的变量。

首先想到的方法是在子shell中运行脚本,在其中输入输入并验证输出。

更好的解决方案是将代码包装在一个方法中,这样您就可以在需要脚本后在rspec脚本中测试它。然后,只测试调用方法的输出。

这是关于测试程序代码的SO Q:How does one unit test sections of code that are procedural or event-based