单元测试:AngularJS + Karma + Jasmine,加载本地JSON

Unit Testing: AngularJS + Karma + Jasmine, loading local JSON

我正在为需要一些相当复杂的 json 对象的项目编写单元测试。它们变得过于冗长而无法插入规范文件,我想将本地 json 文件导入到我的测试中。我尝试了一些对这个项目不起作用的解决方案: Loading a mock JSON file within Karma+AngularJS test How to load external Json file using karma+Jasmine for angularJS testing?/ 并使用 javascript 和 XMLHttpRequest()... 在不创建新依赖项的情况下将外部文件加载到规范中的正确方法是什么?

我认为对您的情况进行测试的最佳方法是使用 $httpBackend。它允许使用您的 $resource$http 并为他们提供测试数据。

如果你必须处理大型 json 对象,你可以在单独的 js 文件中定义它们(在函数中),将这些文件包含在你的测试 js 包中,然后将这些函数调用到 return 当您设置 $httpBackend 服务时,您的 json。 希望这有帮助。

更新 由于测试只是普通的旧 js,您可以创建一个单独的 js 文件。并在其中声明一个函数,它将 return 你的 json.

(function (window) {
    'use strict';

    if (!window.myJsonMocks){
      window.myJsonMocks = {}; //creating the object that will contain all the functions with json
    }

    window.myJsonMocks.myCustomersQueryResultJson = function(){
      return '{"value":[{"CategoryInfo":{"Id":1,"Type":1},"Caption":"Test","Path":"1/#/1"},{"CategoryInfo":{"Id":2,"Type":1},"Caption":"new","Path":"2/#/2"},{"CategoryInfo":{"Id":3,"Type":2},"Caption":"Another one","Path":"3/#/3"}]}'
    };
})(window);

由于您将其声明为 IIFE,它将在全局范围内注册您的函数,以便在您的测试中可用。只要确保在测试场景之前包含它即可。然后你只需调用

$httpBackend.when('GET', 'api/customerssdata').respond(window.myJsonMocks.myCustomersQueryResultJson());
path = basepath;

var json = fixture.load(path + '/login-response.json');

使用夹具。在插件部分,添加 'karma-fixture' 包并添加 karma.conf.js

jsonFixturesPreprocessor: {
  variableName: '__json__'
}