Angularjs 测试在浏览器外部使用数学的角度过滤器
我编写了一个简单的角度滤波器,它在实现中利用了Angularjs 测试在浏览器外部使用数学的角度过滤器,angularjs,unit-testing,jasmine,Angularjs,Unit Testing,Jasmine,我编写了一个简单的角度滤波器,它在实现中利用了Math。当我在浏览器中运行Jasmine规范时,它就工作了,但当我用Chutzpah运行它时,它就不工作了,因为它显然没有定义Math 这是过滤器: return angular.module('app.filters.ddToDmsFilter', []) .filter('ddToDms', function () { return function (dd) { var D = Math.trunc(dd);
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 ...
如何使此测试在浏览器环境之外运行?您可以插入一个使用Math函数的服务。然后,您可以在测试中模拟服务,以摆脱显式的数学调用。显然
Math。trunc
不受广泛支持:
使用上面链接中定义的多边形填充修复了该问题:
Math.trunc = Math.trunc || function (x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
};
Math.trunc=Math.trunc | |函数(x){
返回x<0?数学层(x):数学层(x);
};
能否添加ddToDms
过滤器?基本上,你不是在对过滤器进行操作,你只是创建了过滤器对象。@PankajParkar:我添加了实现。你为什么不使用spyOn
模拟Math
原型?@PankajParkar:我真的不明白这是怎么回事,因为数学的实现是功能的核心。这就是重点。您不想测试Math.truncate的实现是否返回正确的值。您想测试您的筛选器是否可以正确格式化计算结果。我现在已经添加了筛选器的实现。正如您所看到的,Math
的实现是功能的核心,因此我认为我不能以任何有用的方式实际地存根它。我认为您的过滤器有太多的责任。它既使用数学函数进行一些计算,也将结果格式化为所需的输出格式。这里真正要做的是测试数学函数的行为是否正确,而不是测试过滤器是否正确格式化输出。这使得过滤器很难测试。我只是用Math
进行计算,这就是定义方程式的原因。我可以把它分成不同的部分,但这不是重点,我仍然需要使用数学。