如何测试数组rspec中的元素

时间:2014-01-09 16:30:33

标签: 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
      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函数之前调用该函数。好像我会使用存根,但是这个概念还没有完全解决,所以这里的任何指针都会很棒!感谢。

2 个答案:

答案 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

通过这种方式,您正在测试方法的每个部分正在执行所需的操作。