我的任务是将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测试来访问string
和key
变量,以便对它们进行测试。但是,我很难找到一种方法,因为它们没有在方法中定义。我见过的几乎所有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来测试方法/类之外的变量?我完全错了吗?
答案 0 :(得分:1)
您遇到此问题是因为您的代码是程序性的。在这种特殊情况下,您发布的整个脚本似乎充当单个函数,从STDIN获取输入并输出到STDOUT。
您应该测试脚本的输出,而不是变量。确保输出符合预期,间接测试用于测试结果的变量。
首先想到的方法是在子shell中运行脚本,在其中输入输入并验证输出。
更好的解决方案是将代码包装在一个方法中,这样您就可以在需要脚本后在rspec脚本中测试它。然后,只测试调用方法的输出。
这是关于测试程序代码的SO Q:How does one unit test sections of code that are procedural or event-based