我正在做一些简单的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
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
好的,我想要的是测试divisible_numbers数组中的元素。我在测试中访问该数组时遇到一些问题,以验证我想要的数字实际存储在该数组中。有关如何测试的任何建议?我意识到那些第一次测试需要重新编写,但我希望通过测试阵列本身,然后我不必担心测试会破坏道路。
旁注:
我也在寻找一种方法来确保我的find_numbers函数用rspec
调用我的sum_numbers函数。理想情况下,我想测试在创建sum_numbers函数之前调用该函数。好像我会使用存根,但是这个概念还没有完全解决,所以这里的任何指针都会很棒!感谢。
答案 0 :(得分:2)
我建议将divisible_number移动到instance_var:
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
我想测试的东西是有争议的,因为它变得冗长。
答案 1 :(得分:0)
您可以检查是否正在将正确的数组传递给sum_numbers方法。在那一刻你的测试不是检查正确的事我不认为。看起来应该是这样的:
it "calls the sum_numbers function" do
subject.should_receive(:sum_numbers).with([3])
subject.find_numbers(3)
end
通过这种方式,您正在测试方法的每个部分正在执行所需的操作。