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

Angular Jasmine: View console output from controller?

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

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

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;
            }
    };

我最初没有包括它,因为我的问题是关于如何从控制器内部查看调试输出,而不是调试这个特定问题。但无论如何,它在这里只是为了以防万一。

--结束编辑--

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

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

假设你的模拟 returns 是一个承诺,类似于下面的承诺:-

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); 
});

您的 promise.then() 毫无意义,因为它只是用同样微不足道的 return 值包装了原始承诺。您应该删除该行。就目前而言,.then() return 是一个不同的新派生承诺,但您 return 使用原始的非派生承诺。