如何使用 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整除,则为闰年。

结合我们知道的所有这些:

  1. 不能被4整除的年份永远不是闰年。
  2. 能被400整除的年份一定是闰年
  3. 能被4整除的年份不能被100整除的就是闰年

因此,如果您将这 3 种情况一一测试,您就会得到答案