基于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
相关产品推荐
相关产品推荐

