我是AngularJS单元测试的新手,这是一个最佳实践问题。如果我有一个数据工厂和一个控制器在单独的文件中,并且控制器调用工厂,我是否需要为工厂和控制器编写测试规范。实施例
控制器方法和测试:
// controller method ------------------------------------------------------
$scope.getAsset = function (id) {
if ($scope.id != '0') {
assetFactory.getAsset($scope.id)
.then(function (response) {
$scope.asset = response.data;
//$scope.selectedDepartmentName = $scope.asset.DepartmentName;
})
.catch(function (error) {
alertService.add('danger', 'Unable to load asset data: ' + error.statusText + '(' + error.status + '). Please report this error to the application administrator');
});
}
};
// test ------------------------------------------------------
beforeEach(inject(function (assetFactory) {
spyOn(assetFactory, 'getAsset').and.callThrough();
}));
it('method getAsset() was called', inject(function (assetFactory) {
scope.getAsset();
expect(assetFactory.getAsset).toHaveBeenCalled();
}));
工厂方法和测试:
// factory method ------------------------------------------------------
factory.getAsset = function (id) {
url = baseAddress + "asset/get/" + id;
return $http.get(url);
};
// test ------------------------------------------------------
beforeEach(inject(function (assetFactory) {
spyOn(assetFactory, 'getAsset').and.callThrough();
}));
it('method getAsset() was called', inject(function (assetFactory) {
assetFactory.getAsset();
expect(assetFactory.getAsset).toHaveBeenCalled();
}));
控制器测试规范已经在测试工厂调用。我可以看到我是否有一个工厂没有被控制器调用,也许这是测试两者的论据。事实上,在这个应用程序中,所有工厂都在一个或多个控制器内调用。
另一方面,也许我会测试我的所有工厂,并确保定义调用工厂的控制器方法,甚至不要试图在控制器中监视它们。
感谢任何建议。
答案 0 :(得分:0)
单元测试的主要目的是分离出不同的方面,然后单独测试它们。
如果您在callThrough
上进行spyOn
,则基本上是在调用工厂方法。但有了这个,你就不会检查工厂的内在逻辑。这必然意味着对于给定的输入参数,您将获得预期的返回值。但是工厂方法中发生的事情没有经过测试。
我建议在callFake
上使用spyOn
在控制器内部创建一个伪工厂方法,以分离出各个模块的测试。然后单独测试工厂。
[UPDATE]
例如在您的代码段中:
对于您的控制器测试,您可以:
spyOn(assetFactory,'getAsset').and.callFake(function(){
//return some dummyValue or write some dummyCode here
})