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

Unit testing filter error: Expected null to equal [object]

本文关键字:等于 object null 预期 过滤器 错误 单元测试      更新时间:2023-09-26

我对AngularJS和单元测试(Jasmine)有点陌生。我一直在尝试运行一个过滤测试,我一直得到"预期null等于Volvo"。我明白,由于某种原因,当我调用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");
});
});

改成这个…

注:无输入[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 } ];

然后不改变过滤器中的任何,您可以这样测试…

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

你的过滤器将返回一个像这样的对象

{ content: "Volvo", id: 2 }

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