我正在尝试对 Angularjs 中负责文件上传的 Controller 方法进行单元测试:
$scope.uploadFile = function() {
var fd = new FormData();
for (var i in $scope.files) {
fd.append("uploadedFile", $scope.files[i]);
}
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", $scope.uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.open("POST", "/fileupload");
xhr.send(fd);
}
我尝试像下面这样模拟 xhr 对象:
it("using $window ", inject(function($window) {
$window.XMLHttpRequest= angular.noop;
addEventListenerSpy = jasmine.createSpy("addEventListener");
openSpy = jasmine.createSpy("open");
sendSpy = jasmine.createSpy("send");
xhrObj = {
upload:
{
addEventListener: addEventListenerSpy
},
addEventListener: addEventListenerSpy,
open: openSpy,
send: sendSpy
};
spyOn($window, "XMLHttpRequest").andReturn(xhrObj);
}));
当我运行 karma 测试配置文件时出现以下错误:
TypeError: Attempted to assign to readonly property. at workFn (/home/dre/trunk/app/bower_components/angular-mocks/angular-mocks.js:2107)
谁能帮助我,我是 jasmine 和 karma 单元测试的新手
最佳答案
您应该使用 Angular 依赖注入(inject),这对测试有很大帮助。您还应该使用 Angular 的 $http 或 $resource 服务来执行 XHR 请求。
话虽如此,我用你的测试创建了一个 fiddle 。 您的问题中缺少测试实现,例如 Controller 创建。 我希望完整的示例能为您提供有关代码中问题的线索。
it("using $window ", function () {
xhrObj = jasmine.createSpyObj('xhrObj',
['addEventListener', 'open', 'send']);
spyOn(window, "XMLHttpRequest").andReturn(xhrObj);
scope.uploadFile()
expect(xhrObj.addEventListener).toHaveBeenCalled();
expect(xhrObj.addEventListener.calls.length).toBe(2);
});
您可以找到完整示例 here .
但我建议您改用 $http/$resource。
关于unit-testing - 单元测试Angularjs文件上传 Controller 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842850/