单元测试 Hapi 服务器方法

Unit testing Hapi Server Methods

我有一个应用程序大量使用了 Hapi 的 Server Methods。这些方法是通过导出的 register 函数应用的,并且为该方法执行的代码位于同一文件中,因此不会导出。我正在尝试为这些方法编写测试,而不以最简单的方式导出它们调用的函数,但我还没有找到如何这样做的任何示例。

export function register(server) {
  server.method(
    'methodNameA',
    async (path, {}) => {
      // Some code here
      return something; // I want to test this result
    },
    {
      cache: methodCache.halfDay,
      generateKey(path, { ... } = {}) {
        return something;
      },
    }
  );
};

抽象该逻辑是一种选择,但我宁愿不公开它只是为了测试。我也不想为了验证这一点逻辑而测试整条路线(尽管这可能是这里的最终解决方案)。

我将使用 jestjs 作为我的单元测试框架。您可以为 server.method() 提供模拟服务器和模拟实现。然后你就可以在你的测试用例中得到原来的方法了。 得到原方法后,照常测试

例如

register.ts:

export function register(server) {
  server.method('methodNameA', async () => {
    return 'something';
  });
}

register.test.ts:

import { register } from './register';

describe('67093784', () => {
  it('should pass', async () => {
    let methodNameA;
    const mServer = {
      method: function mockImplementation(m, func) {
        methodNameA = func;
      },
    };
    register(mServer);

    // test method
    const actual = await methodNameA();
    expect(actual).toEqual('something');
  });
});

单元测试结果:

 PASS  examples/67093784/register.test.ts (11.981 s)
  67093784
    ✓ should pass (3 ms)

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