我在我的应用程序中使用了moment.js作为日期/时间,但似乎它与Jasmine的模拟功能不相符。我在下面放了一个测试套件,显示了我的问题:
jasmine.clock().mockDate
似乎暂时不起作用,而它适用于Date
。
describe('Jasmine tests', function () {
beforeEach(function() {
jasmine.clock().install();
});
afterEach(function() {
jasmine.clock().uninstall();
});
// Pass
it('uses the mocked time with Date', function() {
var today = new Date('2015-10-19');
jasmine.clock().mockDate(today);
expect(new Date().valueOf()).toEqual(today.valueOf());
});
// Fail
it('uses the mocked time with moment', function() {
var today = moment('2015-10-19');
jasmine.clock().mockDate(today);
expect(moment().valueOf()).toEqual(today.valueOf());
});
});
Date
为什么moment
没有按预期工作?是不是moment
使用Date
?
使用Jasmine模拟moment
的正确方法是什么?
答案 0 :(得分:30)
jasmine.clock().mockDate
期望Date
作为输入。 Date
和moment
不完全兼容。如果您在规范中提供了待模拟日期,则可以在那里使用Date
。
如果您的代码生成了您想要模拟的片刻,或者您更愿意使用片刻API,请查看moment.toDate()
。此方法返回支持片刻的Date
对象。
it('uses the mocked time with moment', function() {
var today = moment('2015-10-19').toDate();
jasmine.clock().mockDate(today);
expect(moment().valueOf()).toEqual(today.valueOf());
});
答案 1 :(得分:0)
了解一下瞬间模拟如何在自己的测试套件中进行自我约会: https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15
答案 2 :(得分:0)
我试图寻找jasmine
或其他模拟框架的替代方案,以避免依赖。
const currentToday = moment().toDate();
console.log(`currentToday:`, currentToday)
const newToday = moment('1980-01-01').toDate();
console.log(`newToday :`, newToday);
Date.now = () => {
return newToday
};
const fakedToday = moment().toDate();
console.log(`fakedToday :`, fakedToday)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
currentToday: 2019-09-17T15:26:12.763Z
newToday : 1980-01-01T00:00:00.000Z
fakedToday : 1980-01-01T00:00:00.001Z
答案 3 :(得分:0)
将时刻导入规范文件
import * as moment from 'moment';
期待您的测试用例时刻
const stringDate = moment.utc(date).format(stringFormat); 期望(stringDate).toEqual('2021-05-23T08:00:00');
最终的规范文件看起来像这样
import { TestBed } from '@angular/core/testing';
import { convertDateToString, getDateDifferenceInHours, getDateIsoStringWithoutTimezone, getDateIsoStringWithTimezone, getDateWithoutTimezone } from './DateHelper';
import * as moment from 'moment';
import * as DateHelper from '@shared/helper/DateHelper';
describe('DateHelper', () => {
beforeEach(async () => {
await TestBed.configureTestingModule({
});
});
it('should convert date to string YYYY-MM-DD', () => {
expect(convertDateToString(new Date('05-23-2021 12:00'), 'YYYY-MM-DD')).toEqual('2021-05-23');
});
it('should convert date to iso string without timezone', () => {
expect(getDateIsoStringWithoutTimezone(new Date('05-23-2021 12:00'))).toEqual('2021-05-23T12:00:00.000Z');
});
});