unit-testing - 单元测试Angularjs文件上传 Controller 方法

标签 unit-testing angularjs jasmine karma-runner

我正在尝试对 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/

相关文章:

testing - Jasmine .toHaveBeenCalledWith(aDate) 不工作

javascript - 如何将 HttpBackend 用于 $http

Python 单元测试 : cancel all tests if a specific test fails

python - 使用缓存装饰器在 Python 中运行单元测试

java - JUnit 中的测试数据

unit-testing - 对于被测类是应该在 fixture 中还是在测试中构建,是否有标准?

javascript - NG-repeat 不起作用 AngularJs

javascript - Angular UI Datepicker 没有在 Dates-Disabled 函数中接收更新的范围变量

javascript - Angularjs 中基于 promise 的单元测试代码

javascript - Angular Jasmine 测试找不到模块