通过 class 间接输入
比如现在我们有以下代码:
// doubleUserAge.ts
export function doubleUserAge(): number {
const user = new User();
return user.age * 2;
}
// User.ts
export class User {
age: number = 18;
name: string = "nansen";
getAge() {
return this.age;
}
}
mock class 中的属性
如果需要测试 doubleUserAge 功能,由于 doubleUserAge 里只用到了 user.age 属性,所以我们可以直接 mock 一个 class User,给定一个 age。
// doubleUserAge.spec.ts
vi.mock("./User", () => {
return {
User: class User {
age: number = 2;
},
};
});
describe("通过 class 间接输入", () => {
it("属性", () => {
const r = doubleUserAge();
expect(r).toBe(4);
});
});
mock class 中的方法
如果现在 doubleUserAge 不再使用 user.age 属性,而是使用 user.getAge 方法来实现。
// doubleUserAge.ts
export function doubleUserAge(): number {
const user = new User();
return user.getAge() * 2;
}
那我们有两种处理方式来 mock getAge 方法。
方式一
// doubleUserAge.spec.ts
vi.mock("./User", () => {
return {
User: class User {
getAge() {
return 2;
}
},
};
});
describe("通过 class 间接输入", () => {
it("方法", () => {
const r = doubleUserAge();
expect(r).toBe(4);
});
});
方式二
// doubleUserAge.spec.ts
import { User } from "./User";
describe("通过 class 间接输入", () => {
it("方法", () => {
User.prototype.getAge = () => 2;
const r = doubleUserAge();
expect(r).toBe(4);
});
});