如何使用RSpec使用默认参数测试Ruby类

时间:2014-08-01 18:12:39

标签: ruby rspec

我有一个名为Grid的课程:

class Grid

  attr_reader :rows, :columns

  def initialize(rows=20, columns=20)

    @rows = rows
    @columns = columns
  end
end

我想测试一下行和列字段默认返回20,否则返回提供的整数。我不知道最好的方法。

我"解决了#34;这通过创建两个Grid实例。一个提供了行和列的值。另一个没有提供的值,因此使用默认值20。

require_relative 'spec_helper.rb'

describe Grid do

  let(:grid) {Grid.new(15, 15)}
  let(:gridNoParameters) {Grid.new()}

  subject { grid }

  describe "#rows" do

    its(:rows) { should eq(15) }

    context "when parameter not supplied" do
      subject { gridNoParameters }

      its(:rows) { should eq(20) }
    end
  end

  describe "#columns" do
    its(:columns) { should eq(15) }

    context "when parameter not supplied" do

    subject { gridNoParameters }

    its(:columns) { should eq(20) }
  end
end

这是最好的测试方式吗?任何帮助都表示赞赏,因为我对Rspec和测试驱动开发都很陌生。

2 个答案:

答案 0 :(得分:2)

我会像这样列出规范:

describe Grid do
  context "#initialize" do
    context "with parameters" do
      let(:grid) { Grid.new(15, 15) }

      it "should use specified values" do
        expect(grid.rows).to eq 15
        expect(grid.columns).to eq 15
      end
    end

    context "without parameters" do
      let(:grid) { Grid.new }

      it "should use defaults" do
        expect(grid.rows).to eq 15
        expect(grid.columns).to eq 15
      end
    end
  end
end

请查看BetterSpecs有关如何组织规范以及使用期望符号等的想法。我不是在这里使用subject的忠实粉丝,但这取决于您,因为这是个人偏好。

答案 1 :(得分:0)

我认为你的方法很好。

  • 您正在测试默认
  • 您正在测试非默认

这个特殊的测试让我觉得有点防守/偏执,但是如果某人在意外更改或删除默认值时测试失败至关重要,那么我猜这个测试很好。

如果所有构造函数都将输入参数复制到实例变量,那么对我来说测试构造函数总是有点奇怪。它接近测试Ruby中的=运算符实际工作,这有点傻。它也接近我所说的“测试打字错误”,其中测试只有在开发人员犯了一个明显的错误或者从方法中删除默认值而不考虑它时才会失败。问题是,我不相信任何数量的测试都可以成功地防止邋iness。

在更复杂的情况下,我可能会非常谨慎,但是你在这里作为一个例子展示的课程是如此简单和直接,以至于我认为它不需要比这更多,个人。