代码之家  ›  专栏  ›  技术社区  ›  damd

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

  •  2
  • damd  · 技术社区  · 9 年前

    我写了一个简单的角度过滤器,它利用 Math 在其实施中。当我在浏览器中运行Jasmine规范时,它会起作用,但当我用Chutzpah运行时,它不会起作用,因为它显然没有定义 数学 .

    这是过滤器:

    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 回复  |  直到 9 年前
        1
  •  2
  •   damd    9 年前

    显然地 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);
    };
    
        2
  •  0
  •   henrikmerlander    9 年前

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