Я пишу единичный тест Жасмин для функции, в которой сравниваются даты. Я хочу предоставить поддельную дату, которая будет использоваться на сегодняшний день. Поэтому я слежу за методом Date
на объекте window и возвращает предопределенную дату.
Это работает отлично, но в функции, которую я тестирую, я также читаю даты из строки и вызывая new Date(yyyy, mm, dd)
чтобы превратить их в даты. Когда это происходит, эти значения заменяются датой макета, которую я предоставил.
Вот пример:
var checkDate = function () {
return { today: new Date(), anotherDay: new Date(2016, 0, 1) }
};
var createDate = function (year, month, date) {
var overrideDate = new Date(year, month, date);
spyOn(window, 'Date').andCallFake(function () {
return overrideDate;
})
}
var dates;
describe("checkDate", function() {
beforeEach(function() {
createDate(2015, 11, 1);
dates = checkDate();
})
it("today has a value of 12/1/2015", function() {
expect(dates.today.toLocaleDateString()).toBe('12/1/2015');
});
it("anotherDay has a value of 1/1/2016", function() {
expect(dates.anotherDay.toLocaleDateString()).toBe('1/1/2016');
})
});
Здесь приведен пример JSFiddle.
Как я могу высмеять только сегодняшнюю дату и разрешить new Date(yyyy, mm, dd)
для создания соответствующего объекта даты? Я ожидал бы, что оба теста в скрипке пройдут, т. anotherDay
настроен на 1/1/2016
а today
установлен на 12/1/2015
.
Карма-Жасмин v 0.1.6.
Вы можете кэшировать window.Date
чтобы использовать его, когда аргументы передаются в ваш макет
var windowDate = window.Date;
spyOn(window, 'Date').andCallFake(function (year,month,day) {
if(year != undefined && month != undefined && day != undefined){
return new windowDate(year,month,day);
}
return overrideDate;
})