Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 测试在浏览器外部使用数学的角度过滤器_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

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
进行计算,这就是定义方程式的原因。我可以把它分成不同的部分,但这不是重点,我仍然需要使用
数学