jasmine + AngularJS - 单元测试调用工厂的工厂和控制器方法

时间:2016-02-11 13:30:15

标签: angularjs unit-testing jasmine

我是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();
}));

控制器测试规范已经在测试工厂调用。我可以看到我是否有一个工厂没有被控制器调用,也许这是测试两者的论据。事实上,在这个应用程序中,所有工厂都在一个或多个控制器内调用。

另一方面,也许我会测试我的所有工厂,并确保定义调用工厂的控制器方法,甚至不要试图在控制器中监视它们。

感谢任何建议。

1 个答案:

答案 0 :(得分:0)

单元测试的主要目的是分离出不同的方面,然后单独测试它们。

如果您在callThrough上进行spyOn,则基本上是在调用工厂方法。但有了这个,你就不会检查工厂的内在逻辑。这必然意味着对于给定的输入参数,您将获得预期的返回值。但是工厂方法中发生的事情没有经过测试。

我建议在callFake上使用spyOn在控制器内部创建一个伪工厂方法,以分离出各个模块的测试。然后单独测试工厂。

[UPDATE]

例如在您的代码段中:

  • 对于您的工厂测试,您应该测试$ http调用以及该$ http调用返回的值是否有效。
  • 对于您的控制器测试,您可以:

    spyOn(assetFactory,'getAsset').and.callFake(function(){ //return some dummyValue or write some dummyCode here })