0

我正在尝试在 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 是在控制器范围内定义的变量。可以看出,该值已被拾取并且比较似乎也是正确的 - 但 Karma 将其报告为失败/错误。

知道为什么吗?

4

3 回答 3

4

而不是使用匹配器toBe使用toEqual

JasminetoBe在 Javascript 中使用 === 运算符。toEqual使用智能比较数组的自定义函数。

于 2013-04-24T17:39:49.897 回答
2

那是因为在 javascript 表达式中['val']===['val']总是计算为假。因此,业力使用相同的东西来比较值,它也失败了。最简单的解决方案是像这样比较它们:

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');
于 2013-04-13T21:15:33.640 回答
0

您可能想在此处更改几件事。除非您有充分的理由,否则不应真正嵌套描述。您在 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"]);
     })
})
于 2016-05-23T01:25:19.013 回答