链式API和Jest期待

时间:2017-12-23 14:07:41

标签: node.js jest

我目前有一个快速应用程序在控制器上执行一堆逻辑。 其中一个步骤是将记录插入数据库(它使用ObjectionJS模型)。

 let user = await this.User.query(trx).insert(userData);

为了模仿模型,我做了:

let mockUser = {
  query: jest.fn(() => {
    return mockUser;
  }),
  insert: jest.fn(() => {
    return mockUser;
  }),
  toJSON: jest.fn()
};

有了这个,我想做一个断言:

expect(mockUser.query().insert).toBeCalledWith({ some: 'data' });

似乎我错过了一些东西。当我运行测试时,代码将到达模拟函数插入。但是开玩笑的抱怨

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用mockFn.mockReturnThis()返回this上下文。

例如

index.js

export async function main(User) {
  const trx = 'the trx';
  const userData = {};
  let user = await User.query(trx).insert(userData);
  return user.toJSON();
}

index.test.js

import { main } from './';

describe('47953161', () => {
  it('should pass', async () => {
    let mockUser = {
      query: jest.fn().mockReturnThis(),
      insert: jest.fn().mockReturnThis(),
      toJSON: jest.fn().mockResolvedValueOnce({ id: 1 }),
    };
    const actual = await main(mockUser);
    expect(actual).toEqual({ id: 1 });
    expect(mockUser.query).toBeCalledWith('the trx');
    expect(mockUser.query().insert).toBeCalledWith({});
    expect(mockUser.query().insert().toJSON).toBeCalledTimes(1);
  });
});

具有覆盖率报告的单元测试结果:

 PASS  src/stackoverflow/47953161/index.test.ts (10.41s)
  47953161
    ✓ should pass (7ms)

----------|----------|----------|----------|----------|-------------------|
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:        12.783s, estimated 13s

源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/47953161