angular - 如何测试使用 moment 的 angular2 服务?

标签 angular momentjs

我正在尝试测试我编写的使用 momentJS 的 Angular (angular2) 服务,但由于 moment 存在于浏览器中,我不断收到引用错误。无论如何告诉业力/ Jasmine 如何在单元测试中使用时刻?这是我得到的错误:

ReferenceError: Can't find variable: moment in karma-test-shim.js (line 33814)

这是我的测试:

describe('isDateBeforeToday', () => {
        it('should return true if date is before today', () => {
            let past = new Date(2016, 1, 1);
            expect(UnitService.isDateBeforeToday(past)).toEqual(true);

            past = new Date();
            past.setDate(past.getDate() - 1);
            past.setHours(23);
            expect(UnitService.isDateBeforeToday(past)).toEqual(true);
        });

        it('should return false if date is today', () => {
            let today = new Date();
            expect(UnitService.isDateBeforeToday(today)).toEqual(false);
        });

        it('should return false if date is in future', () => {
            let future = new Date();
            future.setDate(future.getDate() + 1);
            expect(UnitService.isDateBeforeToday(future)).toEqual(false);
        });
    });

这是我要测试的函数:

static isDateBeforeToday(date: Date) {
        let momentDate = moment(date);
        let now = moment();
        return (momentDate.diff(now, 'days') < 0);
    }

karma-test-shim.js(基于 Angular 示例):

Error.stackTraceLimit = Infinity;

require('core-js/es6');
require('core-js/es7/reflect');

require('zone.js/dist/zone');
require('zone.js/dist/long-stack-trace-zone');
require('zone.js/dist/proxy');
require('zone.js/dist/sync-test');
require('zone.js/dist/jasmine-patch');
require('zone.js/dist/async-test');
require('zone.js/dist/fake-async-test');

require('moment');

var appContext = require.context('../__tests__', true, /\.spec\.ts/);

appContext.keys().forEach(appContext);

var testing = require('@angular/core/testing');
var browser = require('@angular/platform-browser-dynamic/testing');

testing.TestBed.initTestEnvironment(browser.BrowserDynamicTestingModule, browser.platformBrowserDynamicTesting());

业力.conf.js:

var webpackConfig = require('./webpack.test');

module.exports = function (config) {
  var _config = {
    basePath: '',
    browserNoActivityTimeout: 20000, // had to increase this for component unit tests to work

    frameworks: ['jasmine'],

    files: [
      {pattern: './karma-test-shim.js', watched: false}
    ],

    preprocessors: {
      './karma-test-shim.js': ['webpack', 'sourcemap']
    },

    webpack: webpackConfig,

    webpackMiddleware: {
      stats: 'errors-only'
    },

    webpackServer: {
      noInfo: true
    },

    reporters: ['progress','kjhtml'], //leave coverage reporter in for now, even though coverage not working

    coverageReporter: {
        type: 'html',
        dir: '../coverage/'
    },

    browsers: ['phantomJS_without_security'],
    customLaunchers: {
        chrome_without_security: {
            base: 'Chrome',
            flags: ['--disable-web-security']
        },
        phantomJS_without_security: {
            base:'PhantomJS',
            options: {
                windowName: 'Portal-tests',
                settings: {
                    webSecurityEnabled: false
                }
            }
        }
    },

    phantomjsLauncher: {
        // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom)
        exitOnResourceError: true
    },

    client: {
        captureConsole: true
    },

    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: false,
    singleRun: true
  };

  config.set(_config);
};

最佳答案

我最终做了一些非常骇人听闻的事情。我曾经需要从我的 node_modules 导入 moment 库,并将它附加到每个使用 moment 的测试类的 beforeEach 中的 window 对象。如果有人有更好的、不那么骇人听闻的答案,请张贴。

import { UnitService } from '../../src/app/services/unit.service';
let moment = require('moment');

describe('UnitService', () => {

    beforeEach(() => {
        (<any>window).moment = moment;
    });

// Tests that use a function that uses moment go here

});

关于angular - 如何测试使用 moment 的 angular2 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47019617/

相关文章:

javascript - JS中的时刻日期解析

javascript - 使用 moment.js 创建过去 24 小时的数组

meteor - 如何在 Meteor 中包含额外的时刻区域设置

angular - 将 Bootstrap 3 CSS 导入 Angular 2+,使用 SASS 作为 CSS

javascript - 使用外部数据绑定(bind)进行 Angular 表单验证

javascript - Angular 中的两种方式数据绑定(bind)不起作用

Angular2 传递数据以从组件路由

Angular 强类型 react 形式

javascript - nodejs无法用momentjs解析日期

javascript 只识别我的 if 语句