单元测试中需要服务器的存根hapi.js插件函数

时间:2018-12-16 17:03:15

标签: javascript unit-testing sinon hapijs stub

情况:

  • 自定义插件在其register函数中声明了3个函数,因为它们需要hapi.js server对象来调用其他插件
  • server函数中的register对象上只有一个名为“ renderEmailBody”的函数。
  • 一个名为getFreshTemplateRenderFunc的函数正在从数据库中获取数据。
  • 在对该插件进行单元测试时,我想对getFreshTemplateRenderFunc使用sinon进行存根,以便在测试执行期间独立于数据库。

并发症:

  • 我不知道如何getFreshTemplateRenderFunc和在哪里存根。
  • 在register函数之外声明它会更容易,但是会阻止我在server内部使用getFreshTemplateRenderFunc对象。
  • 我可以毫无疑问地对公开的函数'renderEmailBody'进行存根。

解决方法:

  • 以某种方式重组插件以使其更具可测试性,同时在插件中保留getFreshTemplateRenderFunc“私有”。
  • 但是如何?

////////////
// PLUGIN //
////////////
const register = async(server) => {
  // TODO: Make getFreshTemplateRenderFunc stubbable with sinon.stub or .fake
  const getFreshTemplateRenderFunc = async(templateName) => {
    const {
      db
    } = server.mongo;
    const {
      on
    } = server.plugins['alyneUtil'];

    // needs server
    // Calls db, does this and that
    // returns an object, throws an error
  };

  const getTemplateRenderer = memoize(getFreshTemplateRenderFunc);

  const renderEmailBody = async(templateName, payload) => {
    // some things
    const {
      body
    } = await getTemplateRenderer(templateName);
    return await body(payload);
  };

  server.expose('renderEmailBody', renderEmailBody);
};

exports.plugin = {
  name: 'templateManager',
  version: '0.0.1',
  register
};

//////////////
//UNIT TEST //
//////////////
describe('Templates', function() {
  let server;

  before(async() => {

    // TODO: Stub getFreshTemplateRenderFunc with sinon.stub or .fake here ...
    server = await require('../../app').init();
  });

  describe('Fetch templates', function() {
    it('Should fetch a template renderer and render mail', async function() {

      // ... or stub it here
      const templateName = 'honky.tonk.en_GB';
      const greetingPayload = {
        greeting: 'Hello World'
      };
      const expectedBodyResult = '<p>Hello World</p>';

      let renderedBody = await server.plugins[
        'templateManager'
      ].renderEmailBody(templateName, greetingPayload);

      expect(renderedBody).to.equal(expectedBodyResult);
    });
  });
});

0 个答案:

没有答案