AngularJS + Karma(Testacular)
我正在尝试在Karma为基于AngularJS的Web应用程序创建我的第一个单元测试。 我正在使用Jasmine作为测试框架。
我的单元测试看起来像:
describe('FooBar', function() {
describe('FBCtrl', function() {
var scope, ctrl;
beforeEach(function() {
scope = {};
ctrl = new FBCtrl(scope);
});
it('should have correct gender values', function() {
expect(scope.values[0].values).toBe(["M", "F"]);
});
});
});
现在,当我运行测试时,出现以下形式的错误:
Chrome 26.0 (Linux) FooBar FBCtrl should have correct gender values FAILED
Expected [ 'M', 'F' ] to be [ 'M', 'F' ].
Error: Expected [ 'M', 'F' ] to be [ 'M', 'F' ].
at null.<anonymous> //followed by the js file given has input to Karma
这个期望的LHS是一个在控制器范围内定义的变量。 可以看出,价值已被拿起,并且比较也似乎是正确的 - 但卡玛报告这是一个失败/错误。
任何想法为什么?
那么这是因为在javascript表达式['val']===['val']
总是评估为false。 因此,业力使用相同的东西来比较值,并且它也失败了。 最简单的解决方案,将这样比较它们:
var values = scope.values[0].values;
expect(values.toString()).toBe(["M", "F"].toString());
或者你可以做这样的事情:
var values = scope.values[0].values;
expect(values.length).toBe(2);
expect(values).toContain('M');
expect(values).toContain('F');
或者,如果订单也很重要:
var values = scope.values[0].values;
expect(values.length).toBe(2);
expect(values[0]).toBe('M');
expect(values[1]).toBe('F');
而不是使用匹配器toBe
使用toEqual
Jasmine's toBe
在Javascript中使用===运算符。 toEqual
使用巧妙比较数组的自定义函数。
有几件事你可能想在这里改变。 除非你有充分的理由,否则不应该真正嵌套描述。 你在beforeEach中错误地实例化了你的控制器(认为DI是角度的)。 另外,当您可能指“toEqual”时,您正在使用“toBe”。 试试这个代码:
(function() {
'use strict';
describe('MainController', function(){
var controller;
var scope;
beforeEach(module('MY_APP'));
beforeEach(inject(function($controller) {
scope = {};
controller = $controller('MainController', {$scope: scope})
}))
it('should be defined.', function () {
expect(controller).toBeDefined();
});
it('should have correct gender values.', function() {
expect(scope.values[0].values).toEqual(["M", "F"]);
})
})
链接地址: http://www.djcxy.com/p/39107.html
上一篇: AngularJS + Karma (Testacular)
下一篇: Should I be using @Controller classes when doing Spring web flow