使用 Angular 中的 TypeScript 对文件大小进行 Jasmine 单元测试

Tom*_*ais 8 unit-testing file jasmine typescript angular

搜索最佳实践如何在 input type="file" 更改事件上测试文件大小。

现在我的测试规范是这样的:

it('attach file with too large size', () => {
  const file: File = {
    name: 'filename',
    type: 'image/png',
    size: 8242880,
    lastModified: 1,
    lastModifiedDate: new Date(),
    webkitRelativePath: '',
    msClose: () => {},
    msDetachStream: () => {},
    slice: (): Blob => null,
  };
  const event = { target: { files: [file] } };

  component.onFileChange(event); // file validation happens into it too

  const error = control.getError('file_size');
  expect(error).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法如何使用 TypeScript 设置文件大小属性?当我尝试将size属性直接设置为 File 对象时,这是不允许的,因为size属性是read-only.

const file = new File([''], 'filename', { type: 'image/png' });
file.size = 8242880; // TS error
Run Code Online (Sandbox Code Playgroud)

我目前在需要为我定义所有 File 对象属性的情况下模拟 File 对象的方式看起来不是很漂亮,但找不到更好的方法。有任何想法吗?

E. *_*Sun 5

您可以使用Object.defineProperty来覆盖 size 属性。

/** Creates a "1TB" file given the file name. */
function getHugeFile(name: string) : File {
  const file = new File([''], name);
  Object.defineProperty(
      file, 'size', {value: Math.pow(1024, 4), writable: false});
  return file;
}
Run Code Online (Sandbox Code Playgroud)