1

我正在尝试使用 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)闰年不是很常见消息:预期为真为假。Stacktrace:错误:预期 true 为 false。在空。

2) 每 100 年跳过闰年以删除额外的一天消息:预期为真为假。Stacktrace:错误:预期 true 为 false。在空。

在 0.014 秒内完成 4 个测试,4 个断言,2 个失败,0 个跳过

有任何想法吗?

4

2 回答 2

2

它应该很简单:

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的“类”在构造时应该采用整数,并将其存储为成员变量。
  • isLeap 函数不带参数,因此您的函数也不应带任何参数,它使用构造此对象时获得的年份。

然后数学

  • 第一个测试用例只是意味着如果一年不能除以 4,则它不是闰年。
  • 第二个测试用例意味着如果一年可以被4整除,那就是闰年
  • 第三个测试用例表示如果一年可以被4整除,但以00结尾(每100年),则不是闰年。
  • 第4个测试用例表示如果一年可以被4整除,以00结尾,并且可以被400整除,则为闰年。

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

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

所以如果你只是一个一个地测试所有这 3 个案例,那么你会得到你的答案

于 2016-02-29T01:21:53.653 回答
0
  • year % 4 != 0非闰年(2013 年、2014 年、2015 年)。
  • 您还没有代码来说明 100 年和 400 年的情况。
  • 编辑:正如 charlieftl 所说,.toBe(false)不会满足。
于 2016-02-29T00:32:10.603 回答