用 Quasar 和 Typescript 开玩笑

Posted

技术标签:

【中文标题】用 Quasar 和 Typescript 开玩笑【英文标题】:Jest Mocking with Quasar and Typescript 【发布时间】:2021-01-10 03:10:48 【问题描述】:

我想在我的测试中模拟 Amplify Auth 服务。没有错误,但由于我的模拟,测试不起作用。

这是我要测试的代码:

  signIn(): void 
    if (!this.valid) return;
    this.loading = 1;
    this.$Auth
      .signIn(this.email, this.password)
      .then(() => this.$router.push( name: "homeManagement" ))
      .catch((err: any) => (this.errorMessage = err.message))
      .finally(() => (this.loading = 0));
  

这是测试:

const $t = jest.fn();
$t.mockReturnValue("");

const $Auth = jest.fn();
$Auth.mockReturnValue(
  code: "UserNotFoundException",
  name: "UserNotFoundException",
  message: "User does not exist."
);


const factory = mountFactory(LoginForm, 
  mount: 
    mocks: 
      $Auth
    
  
);

describe("LoginForm", () => 
  it("User not found", async () => 
    const wrapper = factory();

    await wrapper.setData(
      email: "david@gmail.com",
      password: "Qwer321"
    );
    await wrapper.vm.signIn();
    expect(wrapper.vm.$data.errorMessage.length).not.toEqual(0);
  );
);

【问题讨论】:

【参考方案1】:

想出了一个解决方案,但也许有一个更好的 flush-promises 来模拟 Amplify 调用:

const $Auth = jest.fn();
$Auth.signIn = () => Promise.resolve();

describe("LoginForm", () => 
it("User does not exist", async () => 
const wrapper = factory();

await wrapper.setData(
  email: "david@gmail.com",
  password: "Qwer321",
  valid: true
);

await wrapper.vm.signIn();
await flushPromises();
expect(wrapper.vm.$data.errorMessage.length).not.toEqual(0);
  );
);

【讨论】:

以上是关于用 Quasar 和 Typescript 开玩笑的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Vue3 和 Typescript 在 Quasar Framework 中定义 ref 方法的类型

无法使用 typescript 用 jest 模拟 fs - 类型上不存在属性“mockReturnValue”

如何允许 scss 开玩笑地对 typescript nextjs 进行单元测试?

在 CI 中使用 typescript 路径开玩笑“找不到模块”

用玩笑模拟打字稿界面

用 Jest 测试 Typescript 接口