【发布时间】:2015-05-11 19:10:58
【问题描述】:
假设我有几个 Backbone 模型,矩形和三角形,每个都扩展多边形。
var Polygon = Backbone.Model.extend({
defaults: {
width: 100,
height: 100,
rotation: 0
},
rotate: function (degrees) {
var oldRotation = this.get('rotation');
var newRotation = (oldRotation + degrees) % 360;
this.set('rotation', newRotation);
return newRotation;
}
});
var Rectangle = Polygon.extend({
area: function (degrees) {
return this.get('width') * this.get('height');
}
});
var Triangle = Polygon.extend({
area: function (degrees) {
return this.get('width') * this.get('height') / 2;
}
}
我想测试 Rectangle 和 Triangle 并确保它们各自正确地独立实现 rotate,尽管我知道(目前)它们都从 Polygon 继承了 rotate 的实现。
我不想做的是为 Rectangle 和 Triangle 创建单独的单元测试,它们几乎是彼此完全相同的副本。在 Mocha 中,如何为 rotate 编写测试并在三角形和矩形的单元测试中重用它?
这是我的单元测试。请注意重复的“旋转 45 度”测试。
describe('A rectangle', function () {
var r = new Rectangle({width: 50, height: 10, rotation: 90});
it('correctly calculates its area', function () {
expect(r.area()).to.equal(500);
});
it('rotates by 45 degrees', function () {
expect(r.rotate(45)).to.equal(135);
});
});
describe('A triangle', function () {
var t = new Triangle({width: 50, height: 10, rotation: 90});
it('correctly calculates its area', function () {
expect(t.area()).to.equal(250);
});
it('rotates by 45 degrees', function () {
expect(t.rotate(45)).to.equal(135);
});
});
【问题讨论】:
-
rotate()在子类中没有变化,为什么还要重新测试?您可以将rotate()测试限制为Polygon的测试。 -
这个想法是多边形具有某些不变量,无论正在测试多边形的哪个子类,测试都应该始终通过。未来,Triangle 可能会实现
rotate()方法来添加一些功能。我想确保Polygon.rotate()的不变量仍然满足Triangle.rotate()。
标签: javascript unit-testing oop backbone.js mocha.js