2016-02-29 2 views
0

Я пытаюсь написать алгоритм високосного года с набором TDD. Это моя первая реальная попытка работать с TDD.Как написать алгоритм високосного года в Javascript с 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) Високосный год не очень часто сообщение : Ожидается, что значение false. Stacktrace: Ошибка: ожидается, что true будет ложным. у null.

2) Високосный год пропускается каждые 100 лет, чтобы удалить дополнительный день Сообщение: Ожидается, что оно будет ложным. Stacktrace: Ошибка: ожидается, что true будет ложным. у null.

Законченный в 0.014 секунд 4 тестов, 4 утверждений, 2 неудачи, 0 пропущено

Любые идеи?

+1

не возвращается ничего в состоянии 'else' – charlietfl

+0

Вы учли только один из 3 правил, считайте' if (year% 4)/* не високосный год */'. Два идти. ;-) – RobG

ответ

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.

Edit:

Объяснение:

Сначала код

  • Тестовый пример хочет объект год, который строит с целым числом, следовательно, ваш leapYear «класс» должен взять в целое при построении, и хранить его в качестве переменной-члена.
  • Функция isLeap не принимает никаких аргументов, поэтому ваш не должен принимать никаких аргументов, он использует год, который он получает при конструировании этого объекта.

Тогда математика

  • первый тест просто означает, если год не может быть разделен на 4, это не високосный год.
  • 2-й тестовый пример означает, что год может быть разделен на 4, это високосный год
  • 3-й тестовый пример означает, что год может быть разделен на 4, но заканчивается 00 (каждые 100 лет), это не високосный год.
  • 4-й тестовый пример означает, что год может быть разделен на 4, заканчивается на 00 и может быть разделен на 400, это високосный год.

Сочетание всех этих мы знаем:

  1. год, которые не могут быть разделены на 4 никогда не високосный год.
  2. Год, который может быть разделен на 400, должен быть високосным годом.
  3. года, который может быть разделен на 4 является високосным, если он не может быть разделен 100

так что если вы просто проверить все эти три случая один на один, то и получить ваш ответ

+0

Неудачи: 1) Високосный год вводится каждые 4 года, чтобы настроить около дня сообщение: Ожидаемая ложь, чтобы быть правдой. Stacktrace: Ошибка: ожидается, что false будет true. у null. 2) Високосный год повторно вводится каждые 400 лет для корректировки другого дня Сообщение: Ожидается, что это правда. Stacktrace: Ошибка: ожидается, что false будет true. у null. Закончено через 0,013 секунд 4 теста, 4 утверждения, 2 отказа, 0 пропущено. Это то, что я получаю, когда пробовал свой код. –

+0

Хорошо, я отредактировал и предоставил код для всего объекта. –

+0

Это сработало !!!! @ rabbit.aaron, не могли бы вы объяснить мне почему? –

0
  • year % 4 != 0 в невисокосных лет (2013, 2014, 2015).
  • У вас еще нет кода для учета 100-летнего и 400-летнего случая.
  • EDIT: Как говорит charlieftl, .toBe(false) не будет удовлетворен.
+0

Нет функции типа 'isLeap' в' Date', но внутренне, да, это так. 'new Date (" 1900/02/29 "). getDate()' говорит '1',' новая дата («2016/02/29»). getDate() 'says' 29'. – Amadan

+0

только curious..have использовали его, но никогда не достигая вне или назад очень далеко – charlietfl

Смежные вопросы