簡體   English   中英

如何開玩笑地模擬膝關節數

[英]How to mock knex count with jest

我正在嘗試模擬 knex 連接以引起故障,以便我可以涵蓋流程的異常情況。 我在這個答案中找到了一種在 de mocks文件夾中進行模擬的方法,但我沒有任何運氣。 我的查詢是計算表中有多少條目:

const db = require("../db/Client");
const logger = require("../utils/Logger");

const createUser = async () => {
    return db("users")
        .count()
        .then(data => {
            return data[0].count;
        })
        .catch(error => {
            logger.error(JSON.stringify(error));
            return null;
        });
};

module.exports = createUser;

我試圖像這樣嘲笑:

module.exports = () => ({
    select: jest.fn().mockReturnThis(),
    then: jest.fn().mockImplementation(() => {
        throw new Error("I am an exception");
    })
});

但是,我得到db("users")不是一個函數。 幫助?

您可以使用jest.mock(moduleName, factory, options)手動模擬db

例如index.js

const db = require('./db/client');

const createUser = async () => {
  return db('users')
    .count()
    .then((data) => {
      return data[0].count;
    })
    .catch((error) => {
      console.log(error);
      return null;
    });
};

module.exports = createUser;

./db/client.js

// knex

index.test.js

const createUser = require('./');
const db = require('./db/client');

jest.mock('./db/client', () => {
  const mKnex = { count: jest.fn() };
  return jest.fn(() => mKnex);
});

describe('60357935', () => {
  it('should count user', async () => {
    const mData = [{ count: 10 }];
    db().count.mockResolvedValueOnce(mData);
    const actual = await createUser();
    expect(actual).toBe(10);
  });

  it('should handle error', async () => {
    const mError = new Error('network');
    db().count.mockRejectedValueOnce(mError);
    const actual = await createUser();
    expect(actual).toBeNull();
  });
});

100% 覆蓋率的單元測試結果:

 PASS  stackoverflow/60357935/index.test.js (5.972s)
  60357935
    ✓ should count user (11ms)
    ✓ should handle error (65ms)

  console.log stackoverflow/60357935/index.js:2895
    Error: network
        at /Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:18:20
        at step (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:33:23)
        at Object.next (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:14:53)
        at /Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:8:71
        at new Promise (<anonymous>)
        at Object.<anonymous>.__awaiter (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:4:12)
        at Object.<anonymous> (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/stackoverflow/60357935/index.test.js:17:29)
        at Object.asyncJestTest (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:100:37)
        at resolve (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
        at new Promise (<anonymous>)
        at mapper (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
        at promise.then (/Users/ldu020/workspace/github.com/mrdulin/react-apollo-graphql-starter-kit/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
        at process._tickCallback (internal/process/next_tick.js:68:7)

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

另一種選擇是使用knex-mock-client ,它用假的連接替換真實的數據庫連接。

const knex = require('knex');
const { getTracker, MockClient } = require('knex-mock-client';
const createUser = require('./');
const db = require('./db/client');

jest.mock('./db/client', () => {
  return {
    db: knex({ client: MockClient })
  };
});

describe('60357935', () => {
  let tracker;

  beforeAll(() => {
    tracker = getTracker();
  });

  afterEach(() => {
    tracker.reset();
  });

  it('should count user', async () => {
    const mData = { count: 10 };
    tracker.on.select('users').responseOnce([mData]);

    const actual = await createUser();
    expect(actual).toBe(mData.count);
  });

  it('should handle error', async () => {
    const mError = new Error('network');
    tracker.on.select('users').simulateErrorOnce('network');

    const actual = await createUser();
    expect(actual).toBeNull();
  });
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM