如何使用 TDD 在 Javascript 中编写闰年算法?
How to write a leap year algorithm in Javascript with TDD?
我正在尝试使用 TDD 套件编写闰年算法。
这是我第一次真正尝试使用 TDD。
这是规范文件中的代码。
var Year = require('./leap');
describe('Leap year', function() {
it('is not very common', function() {
var year = new Year(2015);
expect(year.isLeap()).toBe(false);
});
it('is introduced every 4 years to adjust about a day', function() {
var year = new Year(2016);
expect(year.isLeap()).toBe(true);
});
it('is skipped every 100 years to remove an extra day', function() {
var year = new Year(1900);
expect(year.isLeap()).toBe(false);
});
it('is reintroduced every 400 years to adjust another day', function() {
var year = new Year(2000);
expect(year.isLeap()).toBe(true);
});
这是 leap.js 文件中的代码
var leapYear = function() {};
leapYear.prototype.isLeap = function(year) {
if (year % 4 != 0) {
return true;
}
}
module.exports = leapYear;
我不断得到:
失败:
1) 闰年不是很常见
信息:
预期为假。
堆栈跟踪:
错误:预期为假。
在空。
2) 每 100 年跳过闰年以去除额外的一天
信息:
预期为假。
堆栈跟踪:
错误:预期为假。
在空。
在 0.014 秒内完成
4 次测试,4 次断言,2 次失败,0 次跳过
有什么想法吗?
year % 4 != 0
非闰年(2013、2014、2015)。
- 您还没有代码来说明 100 年和 400 年的情况。
- 编辑:正如 charlieftl 所说,
.toBe(false)
不会令人满意。
它应该像这样简单:
var leapYear = function(year) {this.year = year};
leapYear.prototype.isLeap = function() {
return this.year % 4 == 0 && this.year % 100 != 0 || this.year % 400 == 0;
}
module.exports = leapYear;
如果年份以00结尾(换句话说,year % 100 == 0
),你应该检查它是否可以被400整除。否则只检查它是否可以被4整除。
编辑:
解释:
先上代码
- 测试用例需要一个用整数构造的年份对象,所以你的
leapYear
'class'在构造时应该取一个整数,并存储为一个成员变量。
- isLeap 函数没有参数,因此您的函数也不应该有任何参数,它使用构造此对象时获得的年份。
然后数学
- 第一个测试用例的意思是如果年份不能被 4 除,则不是闰年。
- 第二个测试用例表示如果年份可以除以4,则为闰年
- 第三个测试用例表示如果年份可以除以 4,但以 00 结尾(每 100 年),则它不是闰年。
- 第4个测试用例表示如果年份可以被4整除,以00结尾,并且可以被400整除,则为闰年。
结合我们知道的所有这些:
- 不能被4整除的年份永远不是闰年。
- 能被400整除的年份一定是闰年
- 能被4整除的年份不能被100整除的就是闰年
因此,如果您将这 3 种情况一一测试,您就会得到答案
我正在尝试使用 TDD 套件编写闰年算法。 这是我第一次真正尝试使用 TDD。
这是规范文件中的代码。
var Year = require('./leap');
describe('Leap year', function() {
it('is not very common', function() {
var year = new Year(2015);
expect(year.isLeap()).toBe(false);
});
it('is introduced every 4 years to adjust about a day', function() {
var year = new Year(2016);
expect(year.isLeap()).toBe(true);
});
it('is skipped every 100 years to remove an extra day', function() {
var year = new Year(1900);
expect(year.isLeap()).toBe(false);
});
it('is reintroduced every 400 years to adjust another day', function() {
var year = new Year(2000);
expect(year.isLeap()).toBe(true);
});
这是 leap.js 文件中的代码
var leapYear = function() {};
leapYear.prototype.isLeap = function(year) {
if (year % 4 != 0) {
return true;
}
}
module.exports = leapYear;
我不断得到:
失败:
1) 闰年不是很常见 信息: 预期为假。 堆栈跟踪: 错误:预期为假。 在空。
2) 每 100 年跳过闰年以去除额外的一天 信息: 预期为假。 堆栈跟踪: 错误:预期为假。 在空。
在 0.014 秒内完成 4 次测试,4 次断言,2 次失败,0 次跳过
有什么想法吗?
year % 4 != 0
非闰年(2013、2014、2015)。- 您还没有代码来说明 100 年和 400 年的情况。
- 编辑:正如 charlieftl 所说,
.toBe(false)
不会令人满意。
它应该像这样简单:
var leapYear = function(year) {this.year = year};
leapYear.prototype.isLeap = function() {
return this.year % 4 == 0 && this.year % 100 != 0 || this.year % 400 == 0;
}
module.exports = leapYear;
如果年份以00结尾(换句话说,year % 100 == 0
),你应该检查它是否可以被400整除。否则只检查它是否可以被4整除。
编辑:
解释:
先上代码
- 测试用例需要一个用整数构造的年份对象,所以你的
leapYear
'class'在构造时应该取一个整数,并存储为一个成员变量。 - isLeap 函数没有参数,因此您的函数也不应该有任何参数,它使用构造此对象时获得的年份。
然后数学
- 第一个测试用例的意思是如果年份不能被 4 除,则不是闰年。
- 第二个测试用例表示如果年份可以除以4,则为闰年
- 第三个测试用例表示如果年份可以除以 4,但以 00 结尾(每 100 年),则它不是闰年。
- 第4个测试用例表示如果年份可以被4整除,以00结尾,并且可以被400整除,则为闰年。
结合我们知道的所有这些:
- 不能被4整除的年份永远不是闰年。
- 能被400整除的年份一定是闰年
- 能被4整除的年份不能被100整除的就是闰年
因此,如果您将这 3 种情况一一测试,您就会得到答案