问问自己,如果您使用 TDD 开发它,您会怎么做。这几乎是山姆指出的方向,但这里有一些例子:
控制器测试
- 开始编写一个预期存在 deleteClick 的测试。
- 期望 deleteClick 设置加载状态(检查处理 = true)
- 测试服务是否注入到控制器(peopleNotesSrv)
- 检查 deleteClick 是否调用了服务(正如已经通过间谍提到的)
- 验证 $scope.noteId 和其他 $scope.params 是否存在并设置
这与控制器有关。无论是失败还是抛出错误等所有标准都应该在 Service.spec 中进行测试。由于我不详细了解您的服务,因此这里有一些示例
服务测试
- 确保 deleteNote 存在
- 检查如果提供了错误数量的参数(更少或更多)会发生什么
- 做一些阳性测试(比如你的 noteId = 5)
- 做一些负面测试
- 确保正确调用回调
...等等。
在控制器中测试有效性没有多大意义,因为您需要为您拥有的每个控制器进行测试。通过将服务隔离为单独的测试单元并确保它满足所有要求,您无需测试即可使用它。这有点像您永远不会测试 jQuery 功能或在 Angular jQLite 的情况下,因为您只是希望他们做他们应该做的事情:)
编辑:
在服务调用时使控制器测试失败
很简单,让我们举这个例子。首先,我们创建我们的服务测试,以确保在未提供正确数量的参数时调用失败:
describe('Service: peopleNoteSrv', function () {
// load the service's module
beforeEach(module('angularControllerServicecallApp'));
// instantiate service
var peopleNoteSrv;
beforeEach(inject(function (_peopleNoteSrv_) {
peopleNoteSrv = _peopleNoteSrv_;
}));
it('should throw error on false number of arguments', function () {
expect(function() { peopleNoteSrv.deleteNote('justOneParameter'); }).toThrow();
});
});
现在为了确保测试通过,让我们在我们的服务方法中创建错误抛出部分
angular.module('angularControllerServicecallApp')
.service('peopleNoteSrv', function peopleNoteSrv() {
this.deleteNote = function(param1, param2, param3) {
if(arguments.length !== 3)
throw Error('Invalid number of arguments supplied');
return "OK";
};
});
现在让我们创建 2 个演示控制器,FirstCtrl 会正常执行,但 SecondCtrl 会失败
angular.module('angularControllerServicecallApp')
.controller('FirstCtrl', function ($scope, peopleNoteSrv) {
$scope.doIt = function() {
return peopleNoteSrv.deleteNote('param1', 'param2', 'param3');
}
});
angular.module('angularControllerServicecallApp')
.controller('SecondCtrl', function ($scope, peopleNoteSrv) {
$scope.doIt = function() {
return peopleNoteSrv.deleteNote('onlyOneParameter');
}
});
作为演示的两个控制器都有以下测试:
it('should call Service properly', function () {
expect(scope.doIt()).toBe("OK");
});
Karma 现在吐出如下内容:
Error: Invalid number of arguments supplied
at [PATH]/app/scripts/services/peoplenotesrv.js:15
at [PATH]/app/scripts/controllers/second.js:13
at [PATH]/test/spec/controllers/second.js:20
因此,您确切地知道您错过了更新 SecondCtrl。当然,这应该适用于您使用 Service 方法的任何测试。
希望这就是你的意思。