Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何测试阵列rspec中的元素_Ruby_Rspec - Fatal编程技术网

Ruby 如何测试阵列rspec中的元素

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

我正在做一些简单的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
好的,我想测试可除数数组中的元素。我在从测试中访问该数组时遇到一些问题,无法验证我想要的数字是否确实存储在该数组中。关于如何测试这一点,有什么建议吗?我意识到那些最初的测试需要重新编写,但我希望通过测试阵列本身,我就不必担心测试会中断

旁注:
我还在寻找一种方法来确保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

我想测试的东西是有争议的,因为它会变得冗长。

这正是我想要的。谢谢你的意见。我喜欢在这种情况下设置测试的方式,非常冗长。使理解正在发生的事情变得容易得多。