Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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
Angularjs 如何用茉莉花测试这种测角方法_Angularjs_Jasmine - Fatal编程技术网

Angularjs 如何用茉莉花测试这种测角方法

Angularjs 如何用茉莉花测试这种测角方法,angularjs,jasmine,Angularjs,Jasmine,在我的角度控制器中有以下方法。注意Upload.Upload方法在apply方法中 $scope.apply = function () { $scope.validationErrors.reset(); if ($scope.firstName.trim() === '') { $scope.validationErrors.firstName = 'First name is required.'; } if ($scope.valida

在我的角度控制器中有以下方法。注意Upload.Upload方法在apply方法中

$scope.apply = function () {
    $scope.validationErrors.reset();

    if ($scope.firstName.trim() === '') {
        $scope.validationErrors.firstName = 'First name is required.';
    }

    if ($scope.validationErrors.isValid()){

        Upload.upload({
            url: '/apply',
            fields: {
                'first_name': $scope.firstName,
                'last_name': $scope.lastName
            },
            file: $scope.localFile,
            fileName: $scope.filename
        }).success(function(data){
            if (data === 'successfully saved application'){
                $location.path('/thanks/' + $scope.jobId);
            }else{
                $scope.errorMessage = 'Woops, something went wrong with your application. ' + data;
            }
        });
    }
};
我不知道如何测试该方法的成功部分。这是我到目前为止所做的,但它在scope.apply()行上抛出了一个错误,表示success未定义

describe('apply calls the uploader upload method', function () {
    var upload;
    var returnMessage = 'successfully saved application';
    var deferred;

    beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http, $q, Upload) {
        deferred = $q.defer();
        upload = Upload;
        httpBackend = $httpBackend;
        scope = $rootScope.$new();
        httpBackend.when('POST', '/apply').respond(returnMessage);
        $controller('ApplyController', {
            $scope: scope,
            $routeParams: { id: 1 },
            $http: $http,
            $q: $q,
            Upload: Upload,
            jobService: jobService
        });
        spyOn(upload, 'upload').and.returnValue(deferred);
    }));

    it('calls the Upload upload method', function () {
        scope.firstName = scope.lastName = scope.phoneNumber = scope.zipCode = scope.filename = 'test';
        scope.jobId = 1;
        scope.emailAddress = 'test@test.com';
        scope.apply();
        expect(upload.upload).toHaveBeenCalled();
    });
});

如何测试此方法的成功部分?谢谢。

您必须执行$httpBackend.flush()才能获得模拟http响应。假设其他一切都是正确的,下面的测试应该通过。查看更多信息

旁白:-在每次测试之后,验证通过expect api定义的所有请求都已发出,并且没有需要刷新的未决请求

afterEach(function() {
     $httpBackend.verifyNoOutstandingExpectation();
     $httpBackend.verifyNoOutstandingRequest();
   });
编辑: 发现了另一个问题。设置间谍时,您应该延迟返回。承诺而不是延迟。试试这个:-

spyOn(upload, 'upload').and.returnValue(deferred.promise);

如果这也不起作用,您可以为此共享一个plunker吗?

您必须执行$httpBackend.flush()以获得模拟的http响应/谢谢,但即使添加后,我仍然会收到相同的错误-“undefined不是一个函数…Upload.Upload(..)。successI已更新了答案。看看是否有帮助。如果不是的话,你能为这个分享一个宝物吗?不幸的是,它没有。我不太确定如何在测试的同时为整个应用程序准备一个插件。我最终编写了一种不同的测试,它不担心成功方法,而是测试location.path或scope.errorMessage,这实际上是最终真正需要测试的功能。这很有效,所以我会坚持下去。再次感谢。
spyOn(upload, 'upload').and.returnValue(deferred.promise);