我刚开始使用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
返回一个承诺,我怀疑它的结构不正确,或类似的东西。但是,我不确定如何检查它。
有没有办法从控制器中查看控制台日志以查看实际传入的数据?
答案 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()会返回一个不同的新派生的承诺,但您将返回原始的非派生承诺。