Ruby 如何测试阵列rspec中的元素
我正在做一些简单的TDD,我希望测试我拥有的阵列中的一些元素,但我遇到了一点麻烦。以下是我迄今为止的测试结果:Ruby 如何测试阵列rspec中的元素,ruby,rspec,Ruby,Rspec,我正在做一些简单的TDD,我希望测试我拥有的阵列中的一些元素,但我遇到了一点麻烦。以下是我迄今为止的测试结果: require_relative '../divisible' describe Divisible do before do subject = Divisible.new end describe 'find_numbers' do it "stores a number divisible by 3 and 5 in an array" do
require_relative '../divisible'
describe Divisible do
before do
subject = Divisible.new
end
describe 'find_numbers' do
it "stores a number divisible by 3 and 5 in an array" do
subject.find_numbers(3).should == 1
subject.find_numbers(6).should == 3
subject.find_numbers(12).should == 6
end
it "calls the sum_numbers function" do
subject.find_numbers(3).should_receive(:sum_numbers).with(3)
end
end
end
这是我的班级:
class Divisible
def find_numbers(num)
divisible_numbers = Array.new
for i in 1..num
if (i % 3) == 0 || (i % 5) == 0
divisible_numbers.push(i)
end
end
sum_numbers(divisible_numbers)
return divisible_numbers.count
end
def sum_numbers(array)
end
end
好的,我想测试可除数数组中的元素。我在从测试中访问该数组时遇到一些问题,无法验证我想要的数字是否确实存储在该数组中。关于如何测试这一点,有什么建议吗?我意识到那些最初的测试需要重新编写,但我希望通过测试阵列本身,我就不必担心测试会中断
旁注:
我还在寻找一种方法来确保find_numbers函数使用
rspec
调用sum_numbers函数。理想情况下,我希望在创建sum_numbers函数之前测试函数是否被调用。似乎我会使用存根,但这个概念还没有完全解决,所以这里的任何指针都会很棒!谢谢。您可以检查是否将正确的数组传递到sum\u numbers方法中。目前你的测试没有检查正确的东西,我不认为。它应该是这样的:
it "calls the sum_numbers function" do
subject.should_receive(:sum_numbers).with([3])
subject.find_numbers(3)
end
通过这种方式,您正在测试您的方法的每个部分正在执行所需的操作。我建议将可除数移动到一个实例变量:
class Divisible
attr_accessors :divisible_numbers
def initialize
self.divisible_numbers = []
end
def find_numbers(num)
(1..num).each do |current_num|
if (current_num % 3) == 0 || (current_num % 5) == 0
self.divisible_numbers.push(i)
end
end
self.sum_numbers
self.divisible_numbers.count
end
def sum_numbers
# do whatever with self.divisible_number
end
end
通过这种方式,您可以使测试更加具体:
require_relative '../divisible'
describe Divisible do
before(:each) do
subject = Divisible.new
end
describe 'find_numbers' do
it "returns 1 number divisible by 3 or 5 between 1..3" do
subject.find_numbers(3).should == 1
subject.divisible_numbers.should be == [3]
end
it "returns 3 number divisible by 3 or 5 between 1..6" do
subject.find_numbers(6).should == 3
subject.divisible_numbers.should be == [3, 5, 6]
end
it "returns 6 number divisible by 3 or 5 between 1..12" do
subject.find_numbers(6).should == 3
subject.divisible_numbers.should be == [3, 5, 6, 9, 10, 12]
end
it "calls the sum_numbers function" do
subject.should_receive(:sum_numbers).once
subject.find_numbers(3)
end
end
end
我想测试的东西是有争议的,因为它会变得冗长。这正是我想要的。谢谢你的意见。我喜欢在这种情况下设置测试的方式,非常冗长。使理解正在发生的事情变得容易得多。