2015-01-02 3 views
3

Я пытаюсь написать тест жасмина на каком-то javascript, используя spyon над методом, который использует $ http. Я издевался над этим, используя $ httpBackend, и, к сожалению, шпион, похоже, не подбирает тот факт, что метод действительно назывался post $ http useage. Я вижу, что он вызывается в debug, поэтому не уверен, почему он сообщает, что он не был вызван. Я подозреваю, что у меня проблема с использованием моего приложения? или порядка $ httpBackend.flush \ проверить:

Код тестируемой

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); 
}); 

Тест, который не работает (но должен. кол-0 возвращается, но называется)

it('pageLoad should call setUploadHistory when data returned successfully', function() { 
    // Arrange 
    spyOn($scope, 'setUploadHistory'); 
    // Act 
    $scope.initDataLinkages(); 

    // Assert 
    expect($scope.setUploadHistory.calls.count()).toEqual(1); 
}); 

ответ

2

Вопрос заключается в вызове httpBackend.flush() после того, как ожидают, что означает успех вызывается после того, как вы делаете ваши испытания. Вы должны выполнить флеш перед утверждением ожидания.

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); 
})); 

Вы, возможно, потребуется удалить промывочный заявление от после ваших тестов, но это, вероятно, не должно быть в любом случае, потому что, как правило, это основная часть поведения тестирования и следует ожидать, прежде чем заявления.