Angular Jasmine:从控制器查看控制台输出?

时间:2015-01-02 23:18:17

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

我刚开始使用Jasmine和Karma为我的角度应用创建单元测试。当我认为它不应该时,我有一个失败的测试。我想从控制器本身获取控制台输出,而不仅仅是在控制器上运行的茉莉花测试,这可能吗?

这是一个代码示例: 测试:

it('First test', function() {
    var ctrl = controller('controller', {$scope: scope, MyHttpService: MyHttpMock});
    scope.update();

    console.log("I can see this console output");
    expect(scope.campaignID).toEqual('');
    expect(scope.data.pending).toEqual(20); // <--- fails here
});

控制器:

$scope.update = function() {
    MyHttpService.get('stats').then(function(data) {
        console.log("the data: ", data); // <-- can't see this output
        $scope.data = data;
    });
}

- 编辑 -

以下是MyHttpMock的代码:

   var MyHttpMock = {
        get: function(key) {
                var deferred = $q.defer(),
                promise = deferred.promise;
                promise.then(function(data) {
                        return data;
                });
                if (key == "stats") {
                    deferred.resolve({"pending": 20})
                } else {
                    deferred.resolve({});
                }
                return promise;
            }
    };

我最初没有包含它,因为我的问题是如何从控制器中查看调试输出,而不是调试此特定问题。但无论如何它只是在它有帮助的情况下。

- 结束编辑 -

我可以在测试的控制台日志中看到返回值看起来正确。模拟服务似乎正在做它应该做的事情。但是测试失败了,它显示了scope.pending as undefined。 MyHttpService返回一个承诺,我怀疑它的结构不正确,或类似的东西。但是,我不确定如何检查它。

有没有办法从控制器中查看控制台日志以查看实际传入的数据?

2 个答案:

答案 0 :(得分:2)

假设你的模拟返回一个承诺,如下所示: -

var MyHttpMock = jasmine.createSpyObj('MyHttpMock', ['get']);
MyHttpMock.get.and.returnValue($q.when({pending:20}));

在设置期望之前的测试中以及在进行特定调用之后,您需要手动执行摘要周期以解决承诺。

it('First test', function() {
    var ctrl = controller('controller', {$scope: scope, MyHttpService: MyHttpMock});
    scope.update();
    scope.$apply(); //Trigger a digest
    ///...
    expect(scope.data.pending).toEqual(20); 
});

答案 1 :(得分:0)

你的promise.then()是没有意义的,因为它只是用相同的微不足道的返回值包装原始的promise。你应该删除该行。就目前而言,.then()会返回一个不同的新派生的承诺,但您将返回原始的非派生承诺。