Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 茉莉花退货在模拟工厂被拒绝';承诺_Javascript_Angularjs_Unit Testing_Jasmine - Fatal编程技术网

Javascript 茉莉花退货在模拟工厂被拒绝';承诺

Javascript 茉莉花退货在模拟工厂被拒绝';承诺,javascript,angularjs,unit-testing,jasmine,Javascript,Angularjs,Unit Testing,Jasmine,我的控制器的初始化: var init = function () { httpUsers.getUsers().then(function (data) { $timeout(function() { // Do something... }); }).catch(function (error) { vm.error = "Me!";

我的控制器的初始化:

    var init = function () {
        httpUsers.getUsers().then(function (data) {
            $timeout(function() {
                // Do something...
            });
        }).catch(function (error) {
            vm.error = "Me!";
            toastr.error(error);
        });
    }
我的模拟服务:

beforeEach(function() {
    module('httpService', function($provide) {
        $provide.factory('httpUsers', function () {

            var service = {
                getUsers: getUsers
            }

            function getUsers() {
                    deferred = $q.defer(); // deferred is a global variable
                    deferred.resolve([
                        { id: 1, firstName: "John", lastName: "Doe" },
                        { id: 2, firstName: "Jane", lastName: "Doe" },
                        { id: 3, firstName: "Jack", lastName: "Doe" }
                    ]);
                    return deferred.promise;
            };

            return service;
        });
    });
});
一切都会很好地实现承诺

但是,我想测试控制器的init函数中的
catch
子句

我试过这个:

describe('init', function() {
    it('should throw error', function () {
        deferred.reject('testing');
        expect(controller.error).toBe("Error!");  // NOTE: 'vm' is set to 'this', so controller is 'vm'
    });
});
但我得到的只是:

预期未定义为“Error!”

我没有“测试”,“我!”,或者“错误!”。我如何强制拒绝我的测试承诺

谢谢

编辑
这是我的控制器注入:

beforeEach(inject(function(_$controller_, _$rootScope_, _$q_, _$timeout_, _global_) {

    $rootScope = _$rootScope_;
    $scope = _$rootScope_.$new();
    $q = _$q_;
    $timeout = _$timeout_;
    global = _global_;

    controller = _$controller_('usersController', {
        $rootScope: $rootScope,
        $scope: $scope,
        $q: $q
    });

    $timeout.flush();
}));
如下所示:- 你的模拟服务

beforeEach(function() {
    module('httpService', function($provide) {
        $provide.factory('httpUsers', function () {

            var service = {
                getUsers: getUsers
            }

            function getUsers() {
                deferred = $q.defer(); // deferred is a global variable
                return deferred.promise;
            };

            return service;
        });
    });
});
你的拒绝测试

describe('init', function() {
    it('should throw error', function () {
        deferred.reject('testing');
        $scope.$apply();
        expect(controller.error).toBe("Error!"); 
    });
});
你的决心测试

describe('init', function() {
    it('should throw error', function () {
        deferred.resolve([
                    { id: 1, firstName: "John", lastName: "Doe" },
                    { id: 2, firstName: "Jane", lastName: "Doe" },
                    { id: 3, firstName: "Jack", lastName: "Doe" }
                ]);
        $scope.$apply();
        $timeout.flush();
        expect(controller.error).toBe("Error!"); 
    });
});

尝试作用域。$apply();在您呼叫deferred.reject之后。还要确保正确注入了作用域。我已经尝试过了,并且
$rootScope.$apply()但两者都不起作用。仅供参考,我已经更新了问题,以便您可以看到控制器注入。您是否也可以尝试将deferred.resolve从模拟方法移动到您的测试方法?否则,在调用getUsers时,承诺总是得到解决。我通常只是从模拟服务返回一个承诺,然后在我想测试已解决的承诺时解决它,或者在我想测试拒绝时拒绝它。我不确定我是否足够清楚…我将如何做到这一点?请查看答案。确保您的测试可以访问有效的$scope和$timeout。我想我希望为我的所有测试提供一次数据,并且只提供一个“一次性”场景。有了这个,我必须创建一个全局变量(在我的主“描述”中)来保存一个用户列表,然后对于每个测试,我必须有
deferred.resolve(angular.copy(users))是否有更好的方法重用阵列或使用默认方案?谢谢你的帮助!把它放到函数里怎么样?i、 函数resolvePromise(){deferred.resolve…}。然后在您的测试方法中,只需调用resolvePromise()或rejectPromise()。是的,我有几种方法可以做到这一点。我是jasmine的新手,但我习惯了其他模拟框架,这些框架允许您创建在每次测试之前运行的测试设置装置,但是如果需要,您可以覆盖单个测试中的“默认操作”。因此,同样可以将
deferred.resolve()
作为默认值,但在“一次性”测试中覆盖它。实际上,您可以创建两个测试套件,一个总是解决问题,而另一个总是拒绝承诺。嗯,正如你所说,有很多方法可以做到这一点,所以,选一个你喜欢的,:)