Javascript 使用$httpBackend和$scope对Angular.js进行单元测试。$watch
我正在尝试测试Angular.js控制器。实际上,我正在测试调用一个模拟后端,它返回一些虚拟数据。当我获得数据时,我调用一个服务方法,将结果作为参数传递。 现在,该服务被注入到我尝试测试的控制器中,有一个$scope.$watch方法,它查找服务中更新的值,并设置控制器作用域上的数据Javascript 使用$httpBackend和$scope对Angular.js进行单元测试。$watch,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我正在尝试测试Angular.js控制器。实际上,我正在测试调用一个模拟后端,它返回一些虚拟数据。当我获得数据时,我调用一个服务方法,将结果作为参数传递。 现在,该服务被注入到我尝试测试的控制器中,有一个$scope.$watch方法,它查找服务中更新的值,并设置控制器作用域上的数据 $scope.$watch(function(){ return FileService.getFileData(); }, function (newValue) { self.f
$scope.$watch(function(){
return FileService.getFileData();
}, function (newValue) {
self.fileData = newValue;
self.displayData = [].concat(self.fileData);
});
测试:
在我的测试中,我试图检查fileData变量是否已定义。有一个控制台日志语句,它将fileData变量输出到控制台。但是,expect语句失败,出现以下错误:
PhantomJS 1.9.8 (Linux) ERROR
TypeError: 'null' is not an object (evaluating 'this.results_.addResult')
at /home/saurabh/workspace/OIDE/oide/client/node_modules/karma-jasmine/lib/jasmine.js:2348
两个问题:
这是否是“正确”的方式可能只是一个意见问题,但我的看法是: 1.)我看不到您所有的控制器代码,但通常您不需要在测试中编写实际的http.get调用,正如您在这里所做的那样,这是控制器的工作。您的测试应该实例化控制器(或者执行您的控制器正在侦听的任何操作)来触发http调用,然后您只需根据该调用断言期望值(就像正确设置$scope变量一样) 2.)为什么此服务调用
FileService.getFileData()
被包装在$scope.watch()
中?如果您的答案是只想在上一次成功的http调用后触发此调用,那么您应该在第一次调用后将第二次调用包装为承诺(。然后
或。成功
)。
例:
通过单元测试可能很棘手。你应该确保在你认为有效的前提下先测试否定的情况。 < P>它是否是“正确的”方式可能只是一个观点,但是这里是我的: 1.)我看不到您所有的控制器代码,但通常您不需要在测试中编写实际的http.get调用,正如您在这里所做的那样,这是控制器的工作。您的测试应该实例化控制器(或者执行您的控制器正在侦听的任何操作)来触发http调用,然后您只需根据该调用断言期望值(就像正确设置$scope变量一样) 2.)为什么此服务调用
FileService.getFileData()
被包装在$scope.watch()
中?如果您的答案是只想在上一次成功的http调用后触发此调用,那么您应该在第一次调用后将第二次调用包装为承诺(。然后
或。成功
)。
例:
通过单元测试可能很棘手。你应该确保在你认为它是有效的之前先测试这个否定的情况。< /P>在调用FLUSEH()之后移动预期,以修复这个问题,并使StimeTimeUT不必要。我仍然想知道这个方法是否正确,或者在调用flush()后将expect移动到解决了这个问题,并使setTimeout变得不必要。我仍然想知道这个方法是否正确。谢谢你的回复。该Fileservice.getFileData()调用被包装在$scope.watch中,因为该Fileservice正在另一个控制器中使用,该控制器设置在服务中写入实际HTTP调用时正在检索的值。那么,该服务是否也应该被注入?或者我应该用我在测试中编写的HTTP调用来模拟该服务吗?是的,在测试中注入该服务。然后,您还可以删除测试中的所有模拟服务代码。您总是希望单元测试涵盖应用程序(控制器/服务/工厂)中编写的代码,而不是测试中编写的代码。感谢您的回复。该Fileservice.getFileData()调用被包装在$scope.watch中,因为该Fileservice正在另一个控制器中使用,该控制器设置在服务中写入实际HTTP调用时正在检索的值。那么,该服务是否也应该被注入?或者我应该用我在测试中编写的HTTP调用来模拟该服务吗?是的,在测试中注入该服务。然后,您还可以删除测试中的所有模拟服务代码。您总是希望单元测试涵盖应用程序(控制器/服务/工厂)中编写的代码,而不是测试中编写的代码。
PhantomJS 1.9.8 (Linux) ERROR
TypeError: 'null' is not an object (evaluating 'this.results_.addResult')
at /home/saurabh/workspace/OIDE/oide/client/node_modules/karma-jasmine/lib/jasmine.js:2348
function makeServiceCalls() {
mockFileService.getCurrentDirectory()
.success( function() {
FileService.getFileData()
.then(// do more stuff);
})
.error( function() {
// wah-wahhhh
}
}