gpt4 book ai didi

javascript - 使用带有 $httpBackend 的 spyon 的 Jasmine 测试不工作

转载 作者:行者123 更新时间:2023-11-29 14:49:36 26 4
gpt4 key购买 nike

我正在尝试通过使用 $http 的方法使用 spyon 在某些 javascript 上编写 Jasmine 测试。我已经使用 $httpBackend 对此进行了模拟,不幸的是, spy 似乎没有发现该方法确实已在 $http 使用后调用的事实。我可以看到它在调试中被调用,所以不确定为什么它报告它没有被调用。我怀疑我的示波器使用有问题?或 $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 但被调用)

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

最佳答案

问题是您在 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 语句之前。

关于javascript - 使用带有 $httpBackend 的 spyon 的 Jasmine 测试不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27741024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com