【发布时间】:2021-04-01 08:52:28
【问题描述】:
我正在尝试编写一个单元测试来检查是否调用了 Analytics 的 .track 方法。由于某种原因,测试一直失败,尽管通过 http 调用该函数确实会触发调用。我不确定我是否嘲笑它错了,或者问题可能是什么?
index.ts:
import { Request } from "../types"
import { getSecret } from "../src/secrets"
import Analytics from "analytics-node"
const logger = (req: Request) => {
const analytics = new Analytics(<string>process.env.WRITE_KEY);
return analytics.track({
userId: req.userId
});
}
export default logger
index.test.ts:
jest.mock('analytics-node');
import { Request } from "../types"
import logger from "./index"
import Analytics from "analytics-node"
const mockAnalytics = new Analytics(process.env.WRITE_KEY = 'test');
describe('Logger tests', () => {
it(`Should call analytics.track`, () => {
const request: Request = {
userId: 23
}
return logger(request).then(() => {
expect(mockAnalytics.track).toHaveBeenCalled()
});
});
});
【问题讨论】:
-
你觉得
mockAnalytics与被测代码有什么关系? -
我只是将新的 Analytics 保存到一个变量中。 Jest 自动将类方法替换为 jest.fn() 并且我检查了 mockAnalytics.track 确实存在。它只是没有被调用。
-
但这不是您尝试测试的代码正在使用的实例,那么您为什么期望与它进行交互呢?它也根本不是一个测试替身,它是一个真实的实例。
-
如果我在返回之前 console.log 它在 index.ts 中,我确实得到了一个笑话。
-
因为你正在使用
jest.mock来模拟模块(所以它不是一个真实的实例,对此感到抱歉),但你在测试中创建的实例是不一定在被测代码中创建的相同实例。当你说测试失败时,究竟发生了什么?您是否有手动模拟,是否已配置为让 track 返回承诺?
标签: javascript typescript unit-testing jestjs tdd