单元测试过滤器错误:预期null等于[object]

时间:2015-07-23 17:54:28

标签: javascript angularjs unit-testing jasmine karma-jasmine

我对AngularJS和单元测试(Jasmine)有点新兴。我一直在尝试进行过滤器测试,并且我一直得到“预期的零到沃尔沃”。我理解由于某种原因,当我调用filterInstance(cars,1)时,我总是返回null - 因为在汽车中找不到。你能帮我找一下我的错误吗?

filters.js:

var vmaFilterModule = angular.module('FilterModule', []);
vmaFilterModule.filter('getById', function() {
return function(input, id) {
var i=0, len=input.length;
for (; i<len; i++) {
  if (+input[i].id == +id) {
    return input[i];
  }
}
return null;
} 
});

filtertest.js

describe("Filter Test", function () {

var cars = ["Saab", "Volvo", "BMW"];
var filterInstance;

beforeEach(angular.mock.module("FilterModule"));

beforeEach(angular.mock.inject(function ($filter) {
    filterInstance = $filter("getById");
}));

it("gets correct car", function () {
   expect(filterInstance(cars, 1)).toEqual("Volvo");
});

});

1 个答案:

答案 0 :(得分:0)

改变这个......

注意:没有输入[i] .id使用var i;

var vmaFilterModule = angular.module('FilterModule', []);

vmaFilterModule.filter('getById', function() {
  return function(input, id) {
    var i=0, len=input.length;
    for (; i<len; i++) {
      if (i == +id) {
        return input[i];
      }
    }
   return null;
  } 
});

但是,如果 INPUT 始终是一个数组,而 ID 总是作为第二个参数传递,那么您不必循环。

var vmaFilterModule = angular.module('FilterModule', []);

vmaFilterModule.filter('getById', function() {

  return function(input, id) {
    if( !input ){ return null; }
    return input[id] || null; // Like you did, use the + to force number if needed.
  });

更新2

如果你的数据是......

var cars = [ { content: "Scion", id: 4 }, { content: "Volvo", id: 2 }, { content: "Honda", id: 3 }, { content: "Toyota", id: 7 } ];

然后在不更改过滤器中的 ANYTHING 的情况下,您可以像这样进行测试......

it( "gets correct car", function(){
  expect( filterInstance(cars, 2).content ).toEqual( "Volvo" );
}); // notice the .content change.

您的过滤器将返回这样的对象

{ content: "Volvo", id: 2 }

这意味着您必须使用您要评估的值调用该属性。