如何为单元测试实例化模块



尝试为我的角过滤器运行茉莉单元测试。下面是过滤器的样子:

(function() {
  'use strict';
  var app = angular.module('mymodule');
      app.filter('customCurrency', function($filter) {
        return function(amount, currencySymbol, fractionSize) {
          var currency = $filter('currency');
          if (amount < 0) {
            return currency(amount, currencySymbol).replace('(', '-').replace(')', '');
          }
..

所以我在mymodule中定义了它,这就是单元测试的样子:

describe('custom currency Filter', function() {
  var myUpperFilter, $filter;
  beforeEach(function() {
    module('mymodule');
    inject(function($injector) {
      // Append Filter to the filter name
      // Usign $filter Provider
      $filter = $injector.get('$filter');
    });
  });
  it('if I have 2 zeros in decimals only display max of 2 zeros in decimals', function() {
    // using $filter
    expect($filter('customCurrency')(1.0011, '$', undefined)).toEqual('$1<span class="decimals">.00</span>');
  });
})

但是在运行测试时出现这个错误:

Error: [$injector:modulerr] Failed to instantiate module mymodule due to:
Error: [$injector:nomod] Module 'mymodule' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

更新:我实际上有一个主模块和一个从属模块的情况:

var app = angular.module('plunker', ['ngRoute','mymodule']);
var app2 = angular.module('mymodule');

改变plunkr:

http://plnkr.co/edit/Rcu5gojIJG1GSZEhU4sZ?p =预览

感谢您为我们准备了这个plunkr。这对我实例化测试是有效的。测试失败了,但是您应该可以从这里开始工作:

describe('custom currency Filter', function() {
  var myUpperFilter, $filter;
  beforeEach(module('mymodule'));
  beforeEach(inject(function($injector) {
    // Append Filter to the filter name
    // Usign $filter Provider
    $filter = $injector.get('$filter');
  }));
  it('if I have 2 zeros in decimals only display max of 2 zeros in decimals', function() {
    // using $filter
    expect($filter('customCurrency')(1.0011, '$', undefined)).toEqual('$1<span class="decimals">.00</span>');
  });
});

我想你错过了模块定义中的依赖数组。应该是:

var app = angular.module('mymodule', [])

我还在单独的forEach块中注入模块。

试试这个

演示

app.js

var app = angular.module('mymodule', []);

app.filter('customCurrency', function($filter) {
    return function(amount, currencySymbol, fractionSize) {
      var currency = $filter('currency');
      if (amount < 0) {
        return currency(amount, currencySymbol).replace('(', '-').replace(')', '');
      }
      var rounded = round(amount, fractionSize),
        currencyString = currency(rounded, currencySymbol, fractionSize),
        amounts = currencyString.split("."),
        integerPart = amounts[0],
        fractionalPart = amounts[1] || false,
        zerosFromRight = countZerosFromRight(fractionalPart);

      if (fractionalPart && zerosFromRight > 2) {
        var lastNonZero = indexLastNonZero(fractionalPart);
        // only zeros in fractionalPart
        if (lastNonZero > -1) {
          return integerPart +
            '<span class="decimals">.' +
            fractionalPart.slice(0, lastNonZero + 1) + '</span>';
        }
        return integerPart + '<span class="decimals">.00</span>';
      }

      if (fractionalPart) {
        return integerPart + '<span class="decimals">.' + fractionalPart + '</span>';
      }
      return integerPart;
      /////////////////////////////////////////////
      function round(str, decimals) {
        var num = +str;
        return num.toFixed(decimals);
      }
      function indexLastNonZero(str) {
        var len = str.length;
        while (len--) {
          if (str[len] !== '0') {
            return len;
          }
        }
        return -1;
      }
      function countZerosFromRight(str) {
        var len = str.length,
          count = 0;
        while (len--) {
          if (str[len] === '0') {
            count++;
            continue;
          }
          break;
        }
        return count
      }
    };
  });
规范

describe('custom currency Filter', function() {
  var $scope = null;
  var ctrl = null;
  //you need to indicate your module in a test
  beforeEach(module('mymodule'));
  beforeEach(function() {
    inject(function($injector) {
      $filter = $injector.get('$filter');
    });
  });
  it('if I have 2 zeros in decimals only display max of 2 zeros in decimals', function() {
    // using $filter
    expect($filter('customCurrency')(1.0011, '$', undefined)).toEqual('$1<span class="decimals">.00</span>');
  });

});

最新更新