测试使用Jasmine调用promise的范围函数

时间:2016-09-21 15:25:36

标签: unit-testing jasmine karma-jasmine deferred

我正在为调用Promise的范围函数编写测试,并且我试图访问在promise解析后设置的某些范围属性。

这基本上是我的控制器功能:

$scope.submitNewForm = function (){
    Service.createUser($scope.user).then(function(result){
        if (result){
            $scope.message = 'success';
        } else {
            $scope.message = 'error';
        }
        $scope.$apply();
    });
};

我非常想测试的是,在调用范围函数后,我的$scope.message被设置了。

到目前为止,我已使用$q.defer()进行了一些测试,但没有成功

beforeEach(inject(function ($controller, $rootScope, _Service_, $q) {
    scope = $rootScope.$new();
    Service= _Service_;
    deferred = $q.defer();
    UserController= $controller('UserController', {
        $scope: scope
    });
}));

it('should call Service.createUser and set a message', function(){
    spyOn(Service, 'createUser').and.callFake(function () {
        return deferred.promise;
    });
    scope.submitNewForm();
    scope.$digest();
    expect(scope.message).toBeDefined();
});

关于我失踪的想法?

1 个答案:

答案 0 :(得分:2)

在运行测试时,您可能会收到此类错误。

Error on running the test

那是因为您只是从promise的{​​{1}}方法创建的spy返回了Service

你可以做些什么来修复它? 只需在createUser内进行deferred.rejectdeferred.resolve,即可定义spy。像这样:

scope.message

还有一件事我想建议。您应该将所有间谍保留在注入服务的spyOn(Service, 'createUser').and.callFake(function () { deferred.resolve('success'); return deferred.promise; }); 块内并模拟beforeEach对象。这样他们就可以重复使用了。

<强>更新 要将更改应用于范围,您可以执行以下操作:

controller

不确定这是否有效,但这是通常的做法。