javascript - 如何使用 TDD 在 Javascript 中编写闰年算法?

标签 javascript algorithm tdd jasmine-node leap-year

我正在尝试使用 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 次跳过

有什么想法吗?

最佳答案

它应该像这样简单:

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 种情况一一测试,您就会得到答案

关于javascript - 如何使用 TDD 在 Javascript 中编写闰年算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690126/

相关文章:

unit-testing - 单元测试中的随机数据?

javascript - 如何复制数组行为?

javascript - 将 DOM 元素转换为 HTML 代码并显示在页面文本区域中?

javascript - jQuery 小数未显示在选中框的结果总和中

c++ - 需要有关二叉树程序的帮助(不是二叉搜索树)

algorithm - 时间复杂度: Continuously summing the digits of a number until a single digit result

algorithm - 在树结构的大 O 表示法中 : Why do some sources refer to O(logN) and some to O(h)?

javascript - $.getscript 在使用 swup 库时创建多个调用

Ruby 的 vcr 的 Java 替代品?

ios - 具有大量 View Controller 的 Storyboard或 xib