我对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");
});
});
答案 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 }
这意味着您必须使用您要评估的值调用该属性。