Javascript 用TS中的笑话模拟细分分析

Javascript 用TS中的笑话模拟细分分析,javascript,typescript,unit-testing,jestjs,tdd,Javascript,Typescript,Unit Testing,Jestjs,Tdd,我正在尝试编写一个单元测试,检查是否调用了分析的.track方法。出于某种原因,测试一直失败,尽管通过http调用函数会触发调用。我不确定我是否嘲笑错了,或者问题是什么 index.ts: import { Request } from "../types" import { getSecret } from "../src/secrets" import Analytics from "analytics-node" const l

我正在尝试编写一个单元测试,检查是否调用了分析的.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
您可以通过调用
jest.mock('analytics-node')
来使用

调用jest.mock('analytics-node')返回一个有用的“自动模拟”,您可以使用它监视对类构造函数及其所有方法的调用。它用模拟构造函数替换ES6类,并用总是返回
未定义的
的模拟函数替换其所有方法。方法调用保存在automaticmock.mock.instances[index].methodName.mock.calls中

例如

index.ts

import Analytics from 'analytics-node';

export interface Request {
  userId: string | number;
}

const logger = (req: Request) => {
  const analytics = new Analytics(<string>process.env.WRITE_KEY);
  return analytics.track({
    userId: req.userId,
    anonymousId: 1,
    event: '',
  });
};

export default logger;
import logger, { Request } from './';
import Analytics from 'analytics-node';

jest.mock('analytics-node');
const mockAnalytics = Analytics as jest.MockedClass<typeof Analytics>;

describe('Logger tests', () => {
  afterAll(() => {
    jest.resetAllMocks();
  });
  it(`Should call analytics.track`, () => {
    const WRITE_KEY = process.env.WRITE_KEY;
    process.env.WRITE_KEY = 'test key';
    const request: Request = {
      userId: 23,
    };
    logger(request);
    expect(mockAnalytics).toBeCalledWith('test key');
    expect(mockAnalytics.mock.instances[0].track).toHaveBeenCalled();
    process.env.WRITE_KEY = WRITE_KEY;
  });
});
单元测试结果:

 PASS  examples/65412302/index.test.ts
  Logger tests
    ✓ Should call analytics.track (4 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.ts |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.954 s

你认为
mockAnalytics
与测试中的代码有什么关系?我只是将新的分析保存到一个变量中。Jest会自动用Jest.fn()替换类方法,我已经检查了mockAnalytics.track是否存在。它只是没有被调用,但这不是您试图测试的代码所使用的实例,那么为什么您希望与它进行交互呢?它也不是一个双重测试,它是一个真实的实例。如果我在返回之前将其console.log到index.ts中,我会得到一个jest mock。因为您使用
jest.mock
模拟模块(因此它不是真实的实例,对此表示抱歉),但是您在测试中创建的实例不一定与在测试代码中创建的实例相同。当你说测试失败时,到底发生了什么?您是否有手动模拟,它的配置是否使track返回承诺?@lauraleonilla如果此解决方案工作正常,您可以将其标记为接受答案。
 PASS  examples/65412302/index.test.ts
  Logger tests
    ✓ Should call analytics.track (4 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |      100 |     100 |     100 |                   
 index.ts |     100 |      100 |     100 |     100 |                   
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.954 s