Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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 Jasmine测试使用$httpBackend的spyon无法运行_Javascript_Angularjs_Jasmine_Httpbackend_Spyon - Fatal编程技术网

Javascript Jasmine测试使用$httpBackend的spyon无法运行

Javascript Jasmine测试使用$httpBackend的spyon无法运行,javascript,angularjs,jasmine,httpbackend,spyon,Javascript,Angularjs,Jasmine,Httpbackend,Spyon,我正试图通过使用$http的方法,使用spyon在一些javascript上编写jasmine测试。我已经用$httpBackend模拟了这一点,不幸的是,间谍似乎没有意识到这个方法确实被称为$HttpUseage之后。我可以看到它在调试中被调用,所以不确定它为什么报告没有被调用。我怀疑我的示波器使用有问题?或$httpBackend.flush\verify的订单: 测试中的代码 function FileUploadController($scope, $http, SharedData,

我正试图通过使用$http的方法,使用spyon在一些javascript上编写jasmine测试。我已经用$httpBackend模拟了这一点,不幸的是,间谍似乎没有意识到这个方法确实被称为$HttpUseage之后。我可以看到它在调试中被调用,所以不确定它为什么报告没有被调用。我怀疑我的示波器使用有问题?或$httpBackend.flush\verify的订单:

测试中的代码

function FileUploadController($scope, $http, SharedData, uploadViewModel) {

   Removed variables for brevity
   .....

    $scope.pageLoad = function () {
        $scope.getPeriods();

        if ($scope.uploadViewModel != null && $scope.uploadViewModel.UploadId > 0) {
            $scope.rulesApplied = true;
            $scope.UploadId = $scope.uploadViewModel.UploadId;

            $scope.linkUploadedData();
        } else {
            $scope.initDataLinkages();
        }

    }


    $scope.initDataLinkages = function () {

        $http({ method: "GET", url: "/api/uploadhistory" }).
           success(function (data, status) {
               $scope.status = status;
               $scope.setUploadHistory(data);

           }).
         error(function (data, status) {
             $scope.data = data || "Request failed";
             $scope.status = status;
         });

    }

    $scope.setUploadHistory = function (data) {

        if ($scope.UploadId > 0) {
            $scope.currentUpload = data.filter(function (item) {
                return item.UploadId === $scope.UploadId;
            })[0];

            //Remove the current upload, to prevent scaling the same data!
            var filteredData = data.filter(function (item) {
                return item.UploadId !== $scope.UploadId;
            });
            var defaultOption = {
                UploadId: -1,
                Filename: 'this file',
                TableName: null,
                DateUploaded: null
            };

            $scope.UploadHistory = filteredData;

            $scope.UploadHistory.splice(0, 0, defaultOption);
            $scope.UploadHistoryId = -1;

            $scope.UploadTotal = $scope.currentUpload.TotalAmount;

        } else {
            $scope.UploadHistory = data;
        }
    }
测试设置

beforeEach(module('TDAnalytics'));
beforeEach(inject(function (_$rootScope_, $controller, _$httpBackend_) {
    $rootScope = _$rootScope_;
    $scope = $rootScope.$new();
    $httpBackend = _$httpBackend_;

    var sharedData = { currentBucket: { ID: 1 } };

    controller = $controller('FileUploadController', { $scope: $scope, SharedData: sharedData, uploadViewModel: null }); 

    $httpBackend.when('GET', '/api/Periods').respond(periods);

    $httpBackend.when('GET', '/api/uploadhistory').respond(uploadHistory);


    $scope.mappingData = {
        FieldMappings: [testDescriptionRawDataField, testSupplierRawDataField],
        UserFields: [testDescriptionUserField, testSupplierUserField]
    };
}));

afterEach(function() {
    testDescriptionRawDataField.UserFields = [];
    testSupplierRawDataField.UserFields = [];
    testTotalRawDataField.UserFields = [];

    $httpBackend.flush();
    $httpBackend.verifyNoOutstandingExpectation();
    $httpBackend.verifyNoOutstandingRequest();
});
工作测试:

it('pageLoad should call linkUploadedData when user has navigated to the page via the Data Upload History and uploadViewModel.UploadId is set', function () {
    // Arrange
    spyOn($scope, 'linkUploadedData');
    $scope.uploadViewModel = {UploadId: 1};
    // Act
    $scope.pageLoad();

    // Assert
    expect($scope.rulesApplied).toEqual(true);
    expect($scope.linkUploadedData.calls.count()).toEqual(1);
});
不起作用的测试(但应该。返回count-0但被调用)


问题是在expect之后调用httpBackend.flush(),这意味着在执行测试之后调用success。您必须在expect语句之前刷新

it('pageLoad should call setUploadHistory when data returned successfully',
inject(function ($httpBackend, $rootScope) {
    // Arrange
    spyOn($scope, 'setUploadHistory');
    // Act
    $scope.initDataLinkages();
    $httpBackend.flush();
    $rootScope.$digest()
    // Assert
       expect($scope.setUploadHistory.calls.count()).toEqual(1);
}));
您可能需要在测试之后从中删除flush语句,但它可能无论如何都不应该在那里,因为它通常是测试行为的核心部分,应该在expect语句之前

it('pageLoad should call setUploadHistory when data returned successfully',
inject(function ($httpBackend, $rootScope) {
    // Arrange
    spyOn($scope, 'setUploadHistory');
    // Act
    $scope.initDataLinkages();
    $httpBackend.flush();
    $rootScope.$digest()
    // Assert
       expect($scope.setUploadHistory.calls.count()).toEqual(1);
}));