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

如何在Angular/Jasmine单元测试中加载本地测试文件?

解决Angular Karma测试中导入二进制文件的方案

针对浏览器环境下的Jasmine/Karma测试无法使用Node.js fs模块读取文件的问题,以下是三个可行的实用方案:

方案1:使用Webpack Loader直接导入二进制文件(推荐)

Angular默认基于Webpack构建测试代码,可通过raw-loader将二进制文件直接导入为Uint8Array,再转换为所需的ArrayBuffer:

步骤1:安装依赖

npm install raw-loader --save-dev

步骤2:添加类型声明

在项目根目录或测试目录创建typings.d.ts文件,声明二进制文件的导入类型:

declare module '*.sbsong' {
  const content: Uint8Array;
  export default content;
}

步骤3:调整测试TS配置

修改tsconfig.spec.json,在compilerOptions中启用合成默认导入:

{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true,
    // 保留原有其他配置
  }
}

步骤4:在测试中导入并使用文件

将测试用的sbsong文件放到src/test-files目录,然后在测试代码中直接导入:

// test.spec.ts
import songFile from '../test-files/Be Near.sbsong';

it('should return a song for a SongShow Plus 7 file1', () => {
  const testFile: IRawDataFile = {
    name: 'Be Near',
    ext: 'sbsong',
    type: '',
    dataAsBuffer: songFile.buffer, // 直接获取ArrayBuffer
    dataAsString: ''
  };

  expect(inputConverter.extractSongData(testFile)).toEqual({
    fileName: testFile.name,
    title: 'Be Near',
    info: [
      { name: 'Author', value: 'Barnard, Shane' },
      { name: 'Copyright', value: '2003 Waiting Room Music' },
      { name: 'CCLI', value: '4090362' },
      { name: 'Key', value: 'B' },
    ],
    slides: [/* 预期的幻灯片数据 */]
  });
});

方案2:将二进制文件转为Base64编码后导入

如果不想配置Webpack loader,可以手动或自动化将二进制文件转为Base64,再在测试中解码为ArrayBuffer:

步骤1:生成Base64编码

用Node脚本自动化转换(避免手动复制出错):

// base64-convert.js
const fs = require('fs');
const filePath = './Be Near.sbsong';
const base64Content = fs.readFileSync(filePath, 'base64');
fs.writeFileSync('./be-near-base64.ts', `export const beNearBase64 = '${base64Content}';`);

运行脚本:

node base64-convert.js

步骤2:在测试中解码使用

// test.spec.ts
import { beNearBase64 } from './be-near-base64';

function base64ToBuffer(base64: string): ArrayBuffer {
  const binaryStr = atob(base64);
  const bytes = new Uint8Array(binaryStr.length);
  for (let i = 0; i < binaryStr.length; i++) {
    bytes[i] = binaryStr.charCodeAt(i);
  }
  return bytes.buffer;
}

it('should return a song for a SongShow Plus 7 file1', () => {
  const testFile: IRawDataFile = {
    name: 'Be Near',
    ext: 'sbsong',
    type: '',
    dataAsBuffer: base64ToBuffer(beNearBase64),
    dataAsString: ''
  };

  expect(inputConverter.extractSongData(testFile)).toEqual({
    // 预期结果...
  });
});

方案3:通过Karma静态服务加载文件

将测试文件配置为Karma的静态资源,用fetch在测试中异步加载:

步骤1:修改Karma配置

在karma.conf.js的files数组中添加测试文件配置:

module.exports = function(config) {
  config.set({
    files: [
      // 保留原有文件配置
      { pattern: 'src/test-files/*.sbsong', watched: false, included: false, served: true }
    ],
    // 其他Karma配置...
  });
};

步骤2:在测试中异步加载文件

// test.spec.ts
it('should return a song for a SongShow Plus 7 file1', async () => {
  // Karma静态资源根路径为/base/,根据实际文件位置调整路径
  const response = await fetch('/base/src/test-files/Be Near.sbsong');
  const arrayBuffer = await response.arrayBuffer();

  const testFile: IRawDataFile = {
    name: 'Be Near',
    ext: 'sbsong',
    type: '',
    dataAsBuffer: arrayBuffer,
    dataAsString: ''
  };

  const result = inputConverter.extractSongData(testFile);
  expect(result).toEqual({
    // 预期结果...
  });
});

内容的提问来源于stack exchange,提问作者Chris Barr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:43:12