You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写Jasmine(2.0)测试代码:AngularJS控制器Mock服务

没问题,我来帮你编写一套完整的Jasmine 2.0测试代码,用来Mock AngularJS控制器里的readJsonFactory服务,同时覆盖你提到的相关文件场景。测试文件命名为readjson.spec.js,以下是完整实现:

Jasmine 2.0 测试代码:Mock AngularJS控制器中的服务

测试文件:readjson.spec.js

// 针对ReadJsonController的测试套件
describe('ReadJsonController', function() {
  var $controller, $rootScope, readJsonFactoryMock;
  
  // 模拟AutoTestDB1.json的实际数据结构(请根据你的JSON文件调整)
  var mockAutoTestData = {
    products: [
      { id: 'P001', name: 'Test Product 1', price: 99.99 },
      { id: 'P002', name: 'Test Product 2', price: 199.99 }
    ],
    metadata: { version: '1.0', updated: '2024-05-20' }
  };

  beforeEach(function() {
    // 加载你的Angular应用模块(替换成实际模块名)
    module('yourAppModuleName');

    // 创建Mock版的readJsonFactory,模拟它的核心方法
    readJsonFactoryMock = jasmine.createSpyObj('readJsonFactory', ['loadJsonFile']);
    
    // 注入测试所需的Angular服务
    inject(function(_$controller_, _$rootScope_) {
      $controller = _$controller_;
      $rootScope = _$rootScope_;
    });
  });

  // 测试1:控制器初始化时是否正确调用了工厂的JSON加载方法
  it('should trigger JSON loading via readJsonFactory on init', function() {
    // 实例化控制器,注入Mock服务
    var $scope = $rootScope.$new();
    $controller('ReadJsonController', {
      $scope: $scope,
      readJsonFactory: readJsonFactoryMock
    });

    // 验证工厂方法是否被调用
    expect(readJsonFactoryMock.loadJsonFile).toHaveBeenCalled();
    // 如果你的方法需要传入文件名参数,还可以验证参数:
    expect(readJsonFactoryMock.loadJsonFile).toHaveBeenCalledWith('AutoTestDB1.json');
  });

  // 测试2:当工厂返回成功数据时,控制器是否正确处理并绑定到作用域
  it('should assign fetched JSON data to $scope when load succeeds', function() {
    // 让Mock方法返回模拟的JSON数据
    readJsonFactoryMock.loadJsonFile.and.returnValue(mockAutoTestData);

    var $scope = $rootScope.$new();
    $controller('ReadJsonController', {
      $scope: $scope,
      readJsonFactory: readJsonFactoryMock
    });

    // 验证作用域上的数据是否匹配模拟数据
    expect($scope.dbData).toEqual(mockAutoTestData);
    expect($scope.dbData.products.length).toBe(2);
    expect($scope.dbData.metadata.version).toBe('1.0');
  });

  // 测试3:模拟加载失败场景,验证控制器的错误处理逻辑
  it('should handle loading errors properly', function() {
    // 让Mock方法抛出错误
    var mockError = new Error('Failed to load AutoTestDB1.json');
    readJsonFactoryMock.loadJsonFile.and.throwError(mockError);

    var $scope = $rootScope.$new();
    $controller('ReadJsonController', {
      $scope: $scope,
      readJsonFactory: readJsonFactoryMock
    });

    // 根据你的控制器实际错误处理逻辑调整断言
    expect($scope.loadError).toBe('Failed to load AutoTestDB1.json');
    expect($scope.dbData).toBeUndefined();
  });
});

关键调整说明:

  • 模块名称替换:把代码里的yourAppModuleName改成你Angular应用实际的模块名称。
  • 方法名匹配:如果readJsonFactory的核心方法不是loadJsonFile,请替换成你实际的方法名(比如getAutoTestData)。
  • JSON结构对齐:mockAutoTestData要和你的AutoTestDB1.json实际结构完全一致,这样测试断言才会准确有效。
  • 错误处理适配:如果你的控制器没有错误处理逻辑,可以直接删除第三个测试用例,或者根据实际代码调整断言内容。

测试执行注意事项:

  1. 确保测试环境已加载angular.js、angular-mocks.js和Jasmine 2.0的核心库。
  2. 在Karma或其他测试工具的配置文件中,要包含你的控制器文件、工厂文件以及这个测试文件。

内容的提问来源于stack exchange,提问作者aman jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:06:26