测试在浏览器之外使用Math的Angular过滤器

时间:2016-03-11 09:28:01

标签: angularjs unit-testing jasmine

我编写了一个简单的Angular过滤器,在其实现中使用了Math。当我在浏览器中运行Jasmine规范时,它可以工作,但是当我使用Chutzpah运行它时,它不起作用,因为它显然没有定义Math

这是过滤器:

return angular.module('app.filters.ddToDmsFilter', [])
.filter('ddToDms', function () {
    return function (dd) {
        var D = Math.trunc(dd);
        var M = Math.trunc((dd * 60) % 60);
        var S = Math.round((dd * 3600) % 60);
        return D + '°' + M + '′' + S + '″';
    };
});

这是测试:

define([
    'app',
    'angularAMD',
    'angular-mocks',
    'angular',
    './ddToDmsFilter'
], function () {
    'use strict';

    describe('Filter: ddToDms', function () {

        var ddToDms;

        beforeEach(module('app.filters.ddToDmsFilter'));
        beforeEach(inject(function ($filter) {
            ddToDms = $filter('ddToDms');
        }));

        it('should handle 0', function () {
            expect(ddToDms(0)).toBe('0°0′0″');
        });
    });
});

错误输出:

Test 'Filter: ddToDms:should handle 0' failed
    TypeError: undefined is not a constructor (evaluating 'Math.trunc(dd)') in ...

如何在浏览器环境之外运行此测试?

2 个答案:

答案 0 :(得分:2)

显然Math.trunc不受广泛支持:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc

使用上面链接中定义的polyfill修复了问题:

Math.trunc = Math.trunc || function (x) {
    return x < 0 ? Math.ceil(x) : Math.floor(x);
};

答案 1 :(得分:0)

您可以注入使用Math函数的服务。然后你可以在测试中模拟服务以摆脱显式的数学调用。