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

基于Chai断言的文件属性与API响应验证技术咨询

文件上传测试(Chai框架)问题解答

1. 动态创建的MockFile是否正确?

当前的MockFile类存在多处逻辑错误:

  • 构造函数未将传入的参数绑定到实例,导致testfile.name、testfile.size等属性根本不存在
  • create方法误用Blob构造文件(文件上传应使用标准File对象),且引用了未在方法内定义的变量
  • 未正确模拟File对象的核心属性和行为

修正后的MockFile类:

class MockFile {
  constructor({ name = 'file.txt', size = 1024, type = 'text/plain', lastModified = new Date() }) {
    // 将参数绑定到实例,方便后续访问
    this.name = name;
    this.size = size;
    this.type = type;
    this.lastModified = lastModified;
    // 直接创建标准File实例作为核心内容
    this.file = new File(['a'.repeat(size)], name, { type, lastModified });
  }

  // 可选:保留静态工厂方法简化创建流程
  static create(name, size, mimeType, lastModified = new Date()) {
    return new MockFile({ name, size, type: mimeType, lastModified });
  }
}

2. 如何从testfile中提取文件名?

只要在MockFile的构造函数中将传入的name赋值给this.name,就可以直接通过testfile.name获取文件名。使用修正后的类后,测试用例里的expect(testfile.name).to.equal('helloworld.txt')就能正常通过。

3. 是否正确将文件附加到Request全局对象?

完全错误。文件上传必须使用FormData格式传递数据,不能直接将普通对象作为Request的body。正确的做法是创建FormData实例,将文件添加进去后再传入Request:

修正后的上传测试用例:

it('should return 200 when a valid file is uploaded', async () => {
  const formData = new FormData();
  // 注意后端接收的字段名要匹配,比如后端用'file'接收单文件,用'files[]'接收文件数组
  formData.append('file', testfile.file);

  const request = new Request(COUNT_API_URL, { 
    method: 'POST', 
    body: formData 
    // 无需手动设置Content-Type,浏览器会自动添加boundary标识
  });

  const response = await fetch(request);
  const data = await response.json();
  expect(response.status).to.equal(200);
  expect(data).to.eql({ message: 'request.file.originalname: helloworld.txt' });
});

it('should return 400 when a null file is uploaded', async () => {
  const formData = new FormData();
  // 不添加文件,匹配后端"未上传文件"的校验逻辑

  const request = new Request(COUNT_API_URL, { 
    method: 'POST', 
    body: formData 
  });

  const response = await fetch(request);
  const data = await response.json();
  expect(response.status).to.equal(400);
  expect(data).to.eql({ message: 'Please upload a file' });
});

完整修正后的测试代码

const chai = require('chai');
const expect = chai.expect;
const COUNT_API_URL = 'http://localhost:8080/api/fileUpload';

// 修正后的MockFile类
class MockFile {
  constructor({ name = 'file.txt', size = 1024, type = 'text/plain', lastModified = new Date() }) {
    this.name = name;
    this.size = size;
    this.type = type;
    this.lastModified = lastModified;
    this.file = new File(['a'.repeat(size)], name, { type, lastModified });
  }

  static create(name, size, mimeType, lastModified = new Date()) {
    return new MockFile({ name, size, type: mimeType, lastModified });
  }
}

describe('file-upload-api', () => {
  describe('Mock file for file upload testing', () => {
    const testfile = new MockFile({
      type: 'image/png',
      size: 50000,
      name: 'helloworld.txt',
    });

    it('testfile should be defined with correct properties', () => {
      expect(testfile).to.not.be.undefined;
      expect(testfile.name).to.equal('helloworld.txt');
      expect(testfile.size).to.equal(50000);
      expect(testfile.file).to.be.instanceOf(File);
    });

    it('should return 200 when a valid file is uploaded', async () => {
      const formData = new FormData();
      formData.append('file', testfile.file);

      const request = new Request(COUNT_API_URL, { 
        method: 'POST', 
        body: formData 
      });

      const response = await fetch(request);
      const data = await response.json();
      expect(response.status).to.equal(200);
      expect(data).to.eql({ message: 'request.file.originalname: helloworld.txt' });
    });

    it('should return 400 when a null file is uploaded', async () => {
      const formData = new FormData();

      const request = new Request(COUNT_API_URL, { 
        method: 'POST', 
        body: formData 
      });

      const response = await fetch(request);
      const data = await response.json();
      expect(response.status).to.equal(400);
      expect(data).to.eql({ message: 'Please upload a file' });
    });
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:23:27