茉莉花日期嘲笑 moment.js
Jasmine date mocking with moment.js
我在我的应用程序中将 moment.js 用于 date/time,但它似乎不能很好地与 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
的正确方法是什么?
jasmine.clock().mockDate
期望 Date
作为输入。 Date
和 moment
不完全兼容。如果您在规范本身中提供了待模拟日期,您可以在那里简单地使用 Date
。
如果您的代码生成了您想要模拟的时刻,或者您更愿意使用该时刻 API,请查看 moment.toDate()
。此方法returns 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());
});
看看 moment mock 如何在他们自己的测试套件中约会自己:
https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15
我试图找到 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
将力矩导入规范文件
从 'moment' 导入 * 作为时刻;
期待您的测试用例
const stringDate = moment.utc(date).format(stringFormat);
expect(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');
});
});
我在我的应用程序中将 moment.js 用于 date/time,但它似乎不能很好地与 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
的正确方法是什么?
jasmine.clock().mockDate
期望 Date
作为输入。 Date
和 moment
不完全兼容。如果您在规范本身中提供了待模拟日期,您可以在那里简单地使用 Date
。
如果您的代码生成了您想要模拟的时刻,或者您更愿意使用该时刻 API,请查看 moment.toDate()
。此方法returns 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());
});
看看 moment mock 如何在他们自己的测试套件中约会自己: https://github.com/moment/moment/blob/2e2a5b35439665d4b0200143d808a7c26d6cd30f/src/test/moment/now.js#L15
我试图找到 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
将力矩导入规范文件
从 'moment' 导入 * 作为时刻;
期待您的测试用例
const stringDate = moment.utc(date).format(stringFormat); expect(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');
});
});