AngularJS承诺在测试Jasmine时不会打电话

AngularJS承诺在测试Jasmine时不会打电话,angularjs,jasmine,Angularjs,Jasmine,我有一些问题,当我试图测试控制器使用承诺与茉莉花 我有以下茉莉花测试: describe('Testing a controller', function () { var $scope, $root, ctrl, $q, deferred; var MockService; beforeEach(function () { module('myApp'); inject(function ($rootScope, $controller

我有一些问题,当我试图测试控制器使用承诺与茉莉花

我有以下茉莉花测试:

describe('Testing a controller', function () {
    var $scope, $root, ctrl, $q, deferred;
    var MockService;

    beforeEach(function () {
        module('myApp');
        inject(function ($rootScope, $controller, $q) {

            $root = $rootScope;
            $scope = $rootScope.$new();

            MockService = {
                fetch: function () {
                    return {
                        get: function () {
                            deferred = $q.defer();
                            return {
                                $promise: deferred.promise
                            };
                        }
                    };
                }
            };

            ctrl = $controller('myController', {
                $scope: $scope,
                $root: $rootScope,
                MyService: MockService,
            });
        });

        spyOn(MockService, 'fetch').andCallThrough();
    });

    it('Get data from promise', function () {

        $scope.init();
        deferred.resolve("It worked!");
        $root.$digest();
        expect(MockService.fetch).toHaveBeenCalled();
        expect($scope.test).toBe('It worked!');
    });

});
这是控制器:

controllers.controller('myController', ['$scope','MyService'
    function ($scope, myService) {
        $scope.init = function () {
            myService.fetch().get().$promise.then(function (data) {
                $scope.test = data;
            }, function (error) {
                $scope.error = error;
            });
        };
    }
]);
测试一直失败:“预期未定义为‘It Worked’。”


似乎承诺得到了解决,“then”函数从未被调用。你知道问题出在哪里吗?

看起来像一个简单的问题:控制器期望
myService
完全注入另一个模拟服务
myService
(注意“M”)。因此,mock从未被使用过,而是一个原创的,它永远不会像您期望的那样解决promise

应该是:

ctrl = $controller('myController', {
    $scope: $scope,
    $root: $rootScope,
    myService: MockService,
});

上面介绍的代码似乎可以工作(现在@dfsq的修复程序已经应用)

我只能通过注释掉以下任一行来重现您遇到的错误:

deferred.resolve("It worked!");
$root.$digest();
。。。这让我想知道,在您的实际代码(而不是上面的示例)中,上述两行代码的等价物的实现是否有问题

在同一测试中,您之前是否在不传递参数的情况下执行了
deferred.reject()
,或
deferred.resolve()

使用HTMLReporter的jasmine测试演示:

/*角度应用程序*/
(功能(){
“严格使用”;
angular.module('myApp',[])
.controller('myController',['$scope','MyService',
功能($scope,myService){
$scope.init=函数(){
myService.fetch().get().$promise.then(函数(数据){
$scope.test=数据;
},函数(错误){
$scope.error=错误;
});
};
}
]);
})();
/*单元测试*/
(功能(){
“严格使用”;
var consoleLog=document.querySelector(“#log”);
描述('测试控制器',函数()){
var$scope、$root、ctrl、$q、deferred;
虚拟现实服务;
beforeach(函数(){
模块(“myApp”);
注入(函数($rootScope,$controller,$q){
$root=$rootScope;
$scope=$rootScope.$new();
模拟服务={
fetch:function(){
返回{
get:function(){
递延=$q.defer();
返回{
$promise:延期
};
}
};
}
};
ctrl=$controller('myController'{
$scope:$scope,
$root:$rootScope,
MyService:MockService,
});
});
spyOn(MockService,'fetch')。和callthrough();
});
它('从承诺中获取数据',函数(){
consoleLog.innerHTML+=“”+[
“开始测试:”,
“$scope.test:”+$scope.test,
“$scope.error:”+$scope.error
].join(“
”)+“

”; $scope.init(); 推迟。解决(“成功了!”); $root.$digest(); expect(MockService.fetch).tohaveBeenCall(); expect($scope.test).toBe('It worked!'); consoleLog.innerHTML+=“”+[ “测试结束:”, “$scope.test:“+$scope.test, “$scope.error:”+$scope.error ].join(“
”)+“

”; }); }); })(); /*茉莉自举*/ (功能(){ “严格使用”; var jasmineEnv=jasmine.getEnv(), htmlReporter=new jasmine.htmlReporter(); jasmineEnv.addReporter(htmlReporter); jasminev.execute(); })();


My bad,已更正该错误,但问题仍然存在。谢谢,这很有帮助。我在代码中犯了一个简单的错误,使它无法工作。