【问题标题】:Why jest mock not working if it isn't declared in 'it' scope如果没有在“它”范围内声明,为什么玩笑模拟不起作用
【发布时间】:2021-03-20 17:36:39
【问题描述】:

我用 create-react-app 创建了一个简单的打字稿项目。
我尝试用开玩笑的模拟来创建单元测试。
班级,我想模拟:

export class RestUserAPI {
  public constructor() {}
    getName(): string {
      return "MyUser";
    }
  }
}

我要测试的类

import {RestUserAPI} from "./RestUserAPI";

export class UserService {
  private userAPI: RestUserAPI;
  public constructor() {
    this.userAPI = new RestUserAPI();
  }

  getName(): string {
    return this.userAPI.getName();
  }
}

我的测试不起作用

import { UserService } from './UserService';
import {RestUserAPI} from "./RestUserAPI";

const mockedUserName = 'mocked user name'

jest.mock('./RestUserAPI');
const RestUserAPIMock = RestUserAPI as jest.MockedClass<typeof RestUserAPI>;
RestUserAPIMock.mockImplementation(() => {
   return {
     getName: jest.fn().mockReturnValue(mockedUserName),
   };
});

describe("User Service", () => {
  let instance: UserService;
  beforeAll(() => {
    RestUserAPIMock.mockClear()
  });

  it("should get user name", () => {
    instance = new UserService();
    expect(instance.getName()).toBe(mockedUserName);
    expect(RestUserAPIMock).toHaveBeenCalledTimes(1);
  });
});

这段代码有效,但这不是我想要的

import { UserService } from './UserService';
import {RestUserAPI} from "./RestUserAPI";

const mockedUserName = 'mocked user name'

jest.mock('./RestUserAPI');
const RestUserAPIMock = RestUserAPI as jest.MockedClass<typeof RestUserAPI>;

describe("User Service", () => {
  let instance: UserService;
  beforeAll(() => {
    RestUserAPIMock.mockClear()
  });

  it("should get user name", () => {
    RestUserAPIMock.mockImplementation(() => {
      return {
        getName: jest.fn().mockReturnValue(mockedUserName),
      };
    });

    instance = new UserService();
    expect(instance.getName()).toBe(mockedUserName);
    expect(RestUserAPIMock).toHaveBeenCalledTimes(1);
  });
});

我的错误是什么?
如何为我的所有“it”块创建模拟实现?

【问题讨论】:

    标签: reactjs typescript jestjs mocking


    【解决方案1】:

    您的所有分配代码都应该在beforeEachbeforeAll 块内,因此如果您将mockImplementation 代码移动到beforeAlldescribe 内的单独beforeEach 块内块,它应该工作。 您实际上不需要清除 beforeAll 中的模拟,因此您可以将其删除并用模拟代码替换它。

    【讨论】:

    • 谢谢!我尝试将 mockImplementation 移动到 beforeAll 中,但它不起作用(返回值未定义)。但是,当我用 beforeEach 替换 beforeAll 时,它工作正常。
    • 不要忘记将问题标记为已回答,除非您需要我在接受之前更改我的答案。
    猜你喜欢
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2019-07-18
    • 2013-05-05
    • 2018-04-29
    • 2012-07-06
    • 2012-01-04
    相关资源
    最近更新 更多