hapi lab AssertionError [ERR_ASSERTION]: крошка плагина уже зарегистрирована - PullRequest
2 голосов
/ 03 июня 2019

Я не уверен, почему я получаю это. Я пытаюсь создать простой тест при использовании @hapi/crumb. я регистрирую его только один раз в моем server.js.

const Path = require("path");
const hapi = require("hapi");
const inert = require("inert");
const vision = require("vision");
const Ejs = require("ejs");
const Crumb = require("@hapi/crumb");
const Blankie = require("blankie");
const Scooter = require("@hapi/scooter");
const routes = require("./routes");

// Configure the server
const server = hapi.Server({
  host: "0.0.0.0",
  port: process.env.PORT || 3000,
  routes: {
    files: {
      relativeTo: Path.join(__dirname, "..", "public")
    },
    state: {
      parse: true,
      failAction: "ignore"
    },
    security: {
      xframe: true,
      noOpen: false
    },
    cors: {
      origin: ["banglarelief.org"],
      headers: ["Authorization"], // an array of strings - 'Access-Control-Allow-Headers'
      exposedHeaders: ["Accept"], // an array of exposed headers - 'Access-Control-Expose-Headers',
      additionalExposedHeaders: ["Accept"], // an array of additional exposed headers
      maxAge: 60,
      credentials: true // boolean - 'Access-Control-Allow-Credentials'
    }
  }
});

const plugins = async () => {
  const pluginsToRegister = [
    inert,
    vision,
    require("hapi-mobile-views"),
    { plugin: Crumb, options: { cookieOptions: { isSecure: false } } },
    Scooter,
    {
      plugin: Blankie,
      options: {} // specify options here
    }
  ];
  await server.register(pluginsToRegister);
};

const init = async () => {
  await plugins();
  server.state("player", {
    ttl: null,
    clearInvalid: true,
    isSecure: false
  });
  server.views({
    engines: { ejs: Ejs },
    path: `${__dirname}/views`,
    layout: "layout"
  });
  await server.route(routes);
  return server;
};


const start = async () => {
  try {
    await init();
    await server.start();
  } catch (err) {
    console.log(err);
    process.exit(1);
  }
};

module.exports = { init, start };

Мой тестовый файл очень простой, и я попытался переместиться туда, где должен быть вызван старт, но он продолжает выдавать одну и ту же ошибку.

'use strict';

const Lab = require('@hapi/lab');
const { expect } = require('@hapi/code');
const { afterEach, beforeEach, describe, it } = exports.lab = Lab.script();
const { init, start } = require('../src/server');

let server = start();

describe('GET /', () => {
    //let server;
    //server = start();

    beforeEach(async () => {
        //server = start();
    });

    afterEach(async () => {
        //await server.stop();
    });

    it('responds with 200', async () => {
        const res = await server.inject({
            method: 'get',
            url: '/'
        });
        expect(res.statusCode).to.equal(200);
    });
});

Я следил https://hapijs.com/tutorials/testing?lang=en_US

1 Ответ

0 голосов
/ 18 июля 2019

Решение, похоже, сработает, если вы разделите свою функцию plugins на две части. Одна часть будет инициировать сторонние плагины, такие как @Hapi/*. Другая функция запустит ваши сторонние плагины, которые вы написали. Вы будете запускать только сторонние плагины в вашей функции start.

Очень важно включить { once: true }, потому что это предотвратит вашу ошибку. Он будет только инициализировать плагин один раз, что предотвратит вашу ошибку. Вы не всегда можете указать { once: true } на сторонних плагинах. Таким образом, мы должны обращаться с этим по-другому. Поскольку мы переместили все сторонние плагины в их собственную функцию, которая вызывается при запуске, это должно предотвратить повторную инициализацию сторонних плагинов.

const hapiPlugins = async () => {
  const pluginsToRegister = [
    inert,
    vision,
    require("hapi-mobile-views"),
    { plugin: Crumb, options: { cookieOptions: { isSecure: false } } },
    Scooter,
    {
      plugin: Blankie,
      options: {} // specify options here
    }
  ];
};

const myPlugins = async () => {
  await server.register([
    allOfMyPlugins...
  ],
  {
    once: true  //critical so that you don't re-init your plugins
  });
};

const init = async () => {
  server.state("player", {
    ttl: null,
    clearInvalid: true,
    isSecure: false
  });
  server.views({
    engines: { ejs: Ejs },
    path: `${__dirname}/views`,
    layout: "layout"
  });
  await server.route(routes);
  return server;
};


const start = async () => {
  try {
    await hapiPlugins();
    await init();
    await server.start();
  } catch (err) {
    console.log(err);
    process.exit(1);
  }
};

Тогда вы сможете вызывать init в функции before вашего теста. Используйте этот объект сервера для внедрения.

...