我编写了一个简单的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 ...
如何在浏览器环境之外运行此测试?
答案 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函数的服务。然后你可以在测试中模拟服务以摆脱显式的数学调用。