gpt4 book ai didi

angularjs - 在 angularJS 的 karma-jasmine 单元测试中更改语言环境

转载 作者:行者123 更新时间:2023-12-03 08:21:18 26 4
gpt4 key购买 nike

我正在尝试使用 更改 AngularJS(通过 Karma 运行)的 Jasmine 单元测试中的语言环境 Angular 动态局部 .

describe('currency filter', function () {
var currencyFilter;
var tmhDynamicLocale;

beforeEach(function () {
module('tmh.dynamicLocale');

inject(function ($injector) {
var $filter = $injector.get('$filter');
currencyFilter = $filter('currency');
tmhDynamicLocale = $injector.get('tmhDynamicLocale');
});
});

it('formats US currency in standard form', function () {
expect(currencyFilter(50.17)).toBe("$50.17");
});

it('formats French Canadian value with $ at end and comma for decimal', function () {
tmhDynamicLocale.set('fr-ca');
expect(currencyFilter(50.17)).toBe("50,17$");
});
});
第二次测试失败:
Expected '$50.17' to be '50,17$'.
语言环境从未改变。控制台显示 404 错误:
WARN [web-server]: 404: /angular/i18n/angular-locale_fr-ca.js
在浏览器中运行应用程序时可以识别的这个 URL 路径似乎在通过 Karma 运行时无法识别。
我错过了什么?

最佳答案

终于解决了。我们这里发生了几件事。

  • 我没有在 中加载语言环境 karma .conf.js .我曾尝试加载 加拿大 中的语言环境 karma .conf.js 之前有一次,但我删除了该行,因为它破坏了默认(美国)测试。原来我需要加载 zh-cn 语言环境也是如此(然后在 之前重置语言环境 ,正如我们将在 #4 中看到的那样)。
    files: [
    ...
    'bower_components/angular-i18n/angular-locale_en-us.js',
    'bower_components/angular-i18n/angular-locale_fr-ca.js',
    ...
    ],
  • 马提诺斯正确地说,我需要更改语言环境位置模式。在货币过滤器的直接测试中,这很困难,因为没有可更改的模块 tmhDynamicLocale 的提供者。在我的实际情况中,这不是问题,因为我正在测试一个包含货币过滤器的自定义过滤器。出于本文的目的,我创建了一个脑死包装过滤器:
    (function() {
    angular
    .module('currencyFilterWrapper', [
    'tmh.dynamicLocale'
    ])
    .config(['tmhDynamicLocaleProvider', function(tmhDynamicLocaleProvider) {
    tmhDynamicLocaleProvider.localeLocationPattern('base/bower_components/angular-i18n/angular-locale_{{locale}}.js');
    }])
    .filter('doCurrency', doCurrency)
    ;

    function doCurrency($filter) {
    return function(input) {
    return $filter('currency')(input);
    }
    }
    })();
  • 前两项解决了 404 问题。但是法语-加拿大语言环境在 $ 符号之前指定了一个空格,所以我将断言更改为 expect(currencyFilter(50.17)).toBe("50,17 $");但这也没有用。货币过滤器实际上是插入一个不间断的空格。所以正确的断言是expect(currencyFilter(50.17)).toBe("50,17\u00A0$");
  • tmhDynamicLocale.set 是异步的。此外,我们需要在每次测试之前将语言环境重置为默认值(美国)。所以这是完整的规范(使用 Jasmine 1.3):
    describe('currency filter', function () {
    var currencyFilter;
    var tmhDynamicLocale;

    function setLocale(locale) {
    var localeSet;

    runs(function () {
    tmhDynamicLocale.set(locale)
    .then(function () {
    localeSet = true;
    });
    });

    waitsFor(function () {
    return localeSet;
    }, 'setting locale', 100);
    }

    beforeEach(function () {
    module('currencyFilterWrapper');
    module('tmh.dynamicLocale');

    inject(function ($injector) {
    var $filter = $injector.get('$filter');
    currencyFilter = $filter('doCurrency');
    tmhDynamicLocale = $injector.get('tmhDynamicLocale');
    });

    setLocale('en-us');
    });

    it('formats US currency in standard form', function () {
    expect(currencyFilter(50.17)).toBe("$50.17");
    });

    it('formats French Canadian value with $ at end and comma for decimal', function () {
    setLocale('fr-ca');

    runs(function () {
    expect(currencyFilter(50.17)).toBe("50,17\u00A0$");
    });
    });
    });
  • 关于angularjs - 在 angularJS 的 karma-jasmine 单元测试中更改语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34358692/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com