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) うるう年はあまり一般的ではありません メッセージ: true が false であることが期待されます。スタックトレース: エラー: true が false であると予想されます。ヌルで。

2) うるう年は 100 年ごとにスキップされ、余分な日が削除されます メッセージ: true が false であることが期待されます。スタックトレース: エラー: 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 関数は引数を取らないため、あなたの関数も引数を取るべきではありません。このオブジェクトを構築するときに取得した年を使用します。

次に、数学

  • 1 番目のテスト ケースは、年が 4 で割り切れない場合、うるう年ではないことを意味します。
  • 2番目のテストケースは、年が4で割り切れる場合、うるう年であることを意味します
  • 3 番目のテスト ケースは、年が 4 で割り切れるが 00 で終わる場合 (100 年ごと)、うるう年ではないことを意味します。
  • 4 番目のテスト ケースは、年が 4 で割り切れ、00 で終わり、400 で割り切れる場合、うるう年であることを意味します。

私たちが知っているこれらすべてを組み合わせると:

  1. 4 で割り切れない年はうるう年ではありません。
  2. 400で割り切れる年は閏年です。
  3. 4で割り切れる年が100で割り切れない年は閏年

したがって、これら 3 つのケースすべてを 1 つずつテストすると、答えが得られます。

于 2016-02-29T01:21:53.653 に答える