【问题标题】:How to write a leap year algorithm in Javascript with TDD?如何使用 TDD 在 Javascript 中编写闰年算法?
【发布时间】:2016-02-29 09:52:32
【问题描述】:

我正在尝试使用 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) 闰年并不常见 信息: 预期为真为假。 堆栈跟踪: 错误:预期 true 为 false。 在空。

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

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

有什么想法吗?

【问题讨论】:

  • else 条件下不返回任何内容
  • 您只考虑了 3 条规则之一,请考虑 if (year % 4) /* not leap year*/。两个去。 ;-)

标签: javascript algorithm tdd jasmine-node leap-year


【解决方案1】:

应该很简单:

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整除,则为闰年
  • 第 3 个测试用例表示如果一年可以被 4 整除,但以 00 结尾(每 100 年),则不是闰年。
  • 第 4 个测试用例表示如果一年可以被 4 整除,以 00 结尾,并且可以被 400 整除,则为闰年。

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

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

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

【讨论】:

  • 失败: 1) 每4年引入闰年,调整约1天 消息:预期假为真。 Stacktrace:错误:预期 false 为 true。 at null. 2) 每 400 年重新引入闰年以调整另一天 消息:预期 false 为 true。 Stacktrace:错误:预期 false 为 true。 at null. 在 0.013 秒内完成 4 次测试,4 次断言,2 次失败,0 次跳过。这就是我尝试您的代码时得到的结果。
【解决方案2】:
  • year % 4 != 0非闰年年(2013、2014、2015)。
  • 您还没有代码来说明 100 年和 400 年的情况。
  • 编辑:正如 charlieftl 所说,.toBe(false) 不会满足。

【讨论】:

  • Date 上没有类似isLeap 的功能,但在内部,是的,确实如此。 new Date("1900/02/29").getDate()1new Date("2016/02/29").getDate()29
  • 只是好奇..使用过但从未伸出或返回很远
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多