8

我是打字稿的新手,注意到了我没想到的行为。当我使用js-cookie包模拟命名导入时,它会模拟属性的特定实例,但错误地选择了要使用的正确类型。

import Cookies from "js-cookie"
import { mocked } from "ts-jest/utils"

jest.mock("js-cookie")
const mockedCookies = mocked(Cookies, true)

beforeEach(() => {
  mockedCookies.get = jest.fn().mockImplementation(() => "123")
})

it("SampleTest", () => {
  //this line throws an error as it is using a difference interface to check against
  mockedCookies.get.mockImplementationOnce(() => undefined)
  //continue test...
}

在其中@types/js-cookies有两个定义,get()当我将其引用为mockCookie.get.<some-jest-function>. 因此,我收到打字稿错误说Type 'undefined' is not assignable to type '{ [key: string]: string; }'..

/**
* Read cookie
*/
get(name: string): string | undefined;

/**
* Read all available cookies
*/
get(): {[key: string]: string};

我可以通过每次都重新声明来解决这个问题jest.fn(),但更喜欢使用方便的 jest 函数(如 mockImplementationOnce)。

难道我做错了什么?有没有办法强制get使用哪种类型?

4

2 回答 2

1

我不确定这是否有帮助,但您mockedCookies.get.mockImplementationOnce(() => ({}))现在可以使用来摆脱这个错误。

更新:经过一些测试,我看到这些模拟函数以字典样式格式存储。最后一个同名的函数总是替换前面的函数。

如果你尝试从 'js-cookie' 移到get(name: string)下面get(),你会看到这个错误消失了。所以没有办法获得具有相同名称的特定功能。

于 2021-01-06T06:47:41.400 回答
0

我不太了解您的用例,但您最好不要使用 jest 模拟,而是使用 jest 的 jsdom 环境。然后,您可以使用 js-cookie 的方法设置您的环境。

在您的示例中,您可以Cookies.remove(<cookie name>);作为 setup 运行,然后当您运行时Cookies.get(<cookie name>),您应该得到undefined,不是吗?你必须小心在测试之间保持状态,但无论如何你必须在这个的模拟版本中这样做。

我针对几个简单的案例测试了 jsdom 的实现,但我不知道他们的模拟对于涉及多个域等的更高级的用例有多彻底。

于 2021-01-12T20:40:52.097 回答