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 使用原始的非派生承诺。
我刚刚开始使用 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 使用原始的非派生承诺。