使用 TDD 将索引循环变量传递给 Ruby 中的对象
Passing Index Loop Vars To Objects in Ruby with TDD
我正在尝试在 TDD 和 Ruby 中完成一组非常简单的测试。
我遇到的问题是试图将一系列值从测试传递到被测试的对象。
代码的目的是通过 for 循环向对象发送一系列 'guess' 值来猜测正确的 'secret number',值在 1 到 10 的范围内.
测试应确认以下...
当'guess'值小于5时(5是为'secret number), the object should return a symbol of '设置的固定值:less'.
当'guess'值等于5时对象应该return一个':found_secret_number'的符号。
当 'guess' 值大于 5 时,对象应该 return ':greater' 的符号。
我发现虽然循环确实循环并生成所需的值,但循环仅将生成的最终循环值分配给每个测试(该值为 10)。我想测试会在循环中创建所有测试,然后在末尾分配为 lop 变量设置的任何值(如果您快速查看代码,它可能更有意义...)。
该测试使用分配给对象的静态变量,因此从功能的角度来看 class 很好,但我不希望 100% 的行覆盖率(例如 'guess' 的值3、5 和 7),但想要 100% 的值覆盖率(例如 1、2、3、4、5、6、7、8、9 和 10)。
我玩过并修改过代码,但找不到分配我正在寻找的值范围 (1..10) 的方法,而不必为值覆盖编写 10 个静态案例,所以有人建议如何在不使用十个静态案例的情况下做到这一点吗?:)
顺便说一句,我还在学习,所以如果你能尽可能简单地回答任何问题,那将会有所帮助;)同样,我解释问题可以帮助你理解它,任何关于我如何解释的反馈更好的问题将不胜感激;通信,我相信你们都知道,非常重要,我也在努力改进它。
谢谢!:)
require 'rspec'
class Game
def initialize(secret_number)
@secret_number = secret_number
end
def guess(number)
if (number < @secret_number)
:lower
elsif
(number > @secret_number)
puts ("number is: " + number.to_s)
:greater
elsif (number == @secret_number)
:found_secret_number
end
end
end
# 'describe' is a method, that is passed a 'Game' class,
# it's not normally written like this but I've just shown it this
# way, in this case, to affirm its just plain old Ruby.
describe(Game) do
subject { Game.new(5) }
describe '#guess' do
for i in 1..10
if (i < 5)
puts ("i is less than 5, it is: " + i.to_s)
context 'when guessing a number that is lower than the secret number ' do
it 'returns the symbol :lower' do
expect(subject.guess(val)).to eq(:lower)
end
end
elsif (i == 5)
puts ("i is equal to 5, it is: " + i.to_s)
context 'when guessing a number that is the SAME as the secret number ' do
it 'returns the symbol :found_secret_number' do
expect(subject.guess(val)).to eq(:found_secret_number)
end
end
elsif (i > 5)
puts ("i is greater than 5, it is: " + i.to_s)
context 'when guessing a number that is higher than the secret number ' do
it 'returns the symbol :greater' do
expect(subject.guess(val)).to eq(:greater)
end
end
end
end
end
end
基本上所有花哨的测试方法,如describe
、context
、it
,都只是定义测试方法的方式。 Rspec 然后在实际 运行 进行测试时调用这些测试方法。因此,在这样的循环中调用它们并没有真正意义,因为您正在动态定义测试(当您的情况绝对不需要时)。相反,您应该摆脱循环,并在这些测试用例中定义您的所有期望。例如:
describe(Game) do
subject { Game.new(5) }
describe '#guess' do
context 'when guessing a number that is lower than the secret number ' do
it 'returns the symbol :lower' do
(1..4).each { |val| expect(subject.guess(val)).to eq(:lower) }
end
end
context 'when guessing a number that is the SAME as the secret number ' do
it 'returns the symbol :found_secret_number' do
expect(subject.guess(5)).to eq(:found_secret_number)
end
end
context 'when guessing a number that is higher than the secret number ' do
it 'returns the symbol :greater' do
(6..10).each { |val| expect(subject.guess(val)).to eq(:greater) }
end
end
end
end
然后当我 运行 带有 rspec 的文件时,我得到
...
Finished in 0.02421 seconds (files took 0.26321 seconds to load)
3 examples, 0 failures
我正在尝试在 TDD 和 Ruby 中完成一组非常简单的测试。
我遇到的问题是试图将一系列值从测试传递到被测试的对象。
代码的目的是通过 for 循环向对象发送一系列 'guess' 值来猜测正确的 'secret number',值在 1 到 10 的范围内.
测试应确认以下...
当'guess'值小于5时(5是为'secret number), the object should return a symbol of '设置的固定值:less'.
当'guess'值等于5时对象应该return一个':found_secret_number'的符号。
当 'guess' 值大于 5 时,对象应该 return ':greater' 的符号。
我发现虽然循环确实循环并生成所需的值,但循环仅将生成的最终循环值分配给每个测试(该值为 10)。我想测试会在循环中创建所有测试,然后在末尾分配为 lop 变量设置的任何值(如果您快速查看代码,它可能更有意义...)。
该测试使用分配给对象的静态变量,因此从功能的角度来看 class 很好,但我不希望 100% 的行覆盖率(例如 'guess' 的值3、5 和 7),但想要 100% 的值覆盖率(例如 1、2、3、4、5、6、7、8、9 和 10)。
我玩过并修改过代码,但找不到分配我正在寻找的值范围 (1..10) 的方法,而不必为值覆盖编写 10 个静态案例,所以有人建议如何在不使用十个静态案例的情况下做到这一点吗?:)
顺便说一句,我还在学习,所以如果你能尽可能简单地回答任何问题,那将会有所帮助;)同样,我解释问题可以帮助你理解它,任何关于我如何解释的反馈更好的问题将不胜感激;通信,我相信你们都知道,非常重要,我也在努力改进它。
谢谢!:)
require 'rspec'
class Game
def initialize(secret_number)
@secret_number = secret_number
end
def guess(number)
if (number < @secret_number)
:lower
elsif
(number > @secret_number)
puts ("number is: " + number.to_s)
:greater
elsif (number == @secret_number)
:found_secret_number
end
end
end
# 'describe' is a method, that is passed a 'Game' class,
# it's not normally written like this but I've just shown it this
# way, in this case, to affirm its just plain old Ruby.
describe(Game) do
subject { Game.new(5) }
describe '#guess' do
for i in 1..10
if (i < 5)
puts ("i is less than 5, it is: " + i.to_s)
context 'when guessing a number that is lower than the secret number ' do
it 'returns the symbol :lower' do
expect(subject.guess(val)).to eq(:lower)
end
end
elsif (i == 5)
puts ("i is equal to 5, it is: " + i.to_s)
context 'when guessing a number that is the SAME as the secret number ' do
it 'returns the symbol :found_secret_number' do
expect(subject.guess(val)).to eq(:found_secret_number)
end
end
elsif (i > 5)
puts ("i is greater than 5, it is: " + i.to_s)
context 'when guessing a number that is higher than the secret number ' do
it 'returns the symbol :greater' do
expect(subject.guess(val)).to eq(:greater)
end
end
end
end
end
end
基本上所有花哨的测试方法,如describe
、context
、it
,都只是定义测试方法的方式。 Rspec 然后在实际 运行 进行测试时调用这些测试方法。因此,在这样的循环中调用它们并没有真正意义,因为您正在动态定义测试(当您的情况绝对不需要时)。相反,您应该摆脱循环,并在这些测试用例中定义您的所有期望。例如:
describe(Game) do
subject { Game.new(5) }
describe '#guess' do
context 'when guessing a number that is lower than the secret number ' do
it 'returns the symbol :lower' do
(1..4).each { |val| expect(subject.guess(val)).to eq(:lower) }
end
end
context 'when guessing a number that is the SAME as the secret number ' do
it 'returns the symbol :found_secret_number' do
expect(subject.guess(5)).to eq(:found_secret_number)
end
end
context 'when guessing a number that is higher than the secret number ' do
it 'returns the symbol :greater' do
(6..10).each { |val| expect(subject.guess(val)).to eq(:greater) }
end
end
end
end
然后当我 运行 带有 rspec 的文件时,我得到
...
Finished in 0.02421 seconds (files took 0.26321 seconds to load)
3 examples, 0 failures