我有一个名为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和测试驱动开发都很陌生。
答案 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。
在更复杂的情况下,我可能会非常谨慎,但是你在这里作为一个例子展示的课程是如此简单和直接,以至于我认为它不需要比这更多,个人。