Тайм-аут соединения на тесте клиент-сервер перьев - PullRequest
0 голосов
/ 03 апреля 2019

Я делаю тур через "Приложение чата" на домашней странице перьев, а затем сейчас я нахожусь на стадии написания теста.https://docs.feathersjs.com/guides/chat/testing.html

Я настроил файл client-users.test.js точно так же, как код, указанный в статье

/* eslint-disable indent */
/* eslint-disable no-console */
const assert = require('assert');
const feathersClient = require('@feathersjs/client');
const io = require('socket.io-client');
const app = require('../../src/app');

const host = app.get('host');
const port = app.get('port');
const email = 'login@example.com';
const password = 'login';

describe('\'users\' service - client', function () {
  this.timeout(20000);
  let server;
  let client;

  before(async () => {
    await app.service('users').create({
      email,
      password
    });

    server = app.listen(port);
    server.on('listening', async () => {
      // eslint-disable-next-line no-console
      console.log(
        'CLIENT - Feathers application started on http://%s:%d',
        host,
        port
      );
    });
    client = await makeClient(host, port, email, password);
  });

  after((done) => {
    client.logout();
    server.close(done);
  });

  describe('Run tests using client and server', () => {
    it('registered the service', () => {
      const service = client.service('users');

      assert.ok(service, 'Registered the service');
    });

    it('creates a user, encrypts password and adds gravatar', async () => {
      const user = await client.service('users').create({
        email: 'testclient@example.com',
        password: 'secret'
      });

      // Verify Gravatar has been set to what we'd expect
      assert.equal(
        user.avatar,
        'https://s.gravatar.com/avatar/1b9c869fa7a93e59463c31a377fe0cf6?s=60'
      );
      // Makes sure the password got encrypted
      assert.ok(user.password !== 'secret');
    });

    it('removes password for external requests', async () => {
      // Setting `provider` indicates an external request
      const params = {
        provider: 'rest'
      };

      const user = await client.service('users').create({
          email: 'testclient2@example.com',
          password: 'secret'
        },
        params
      );

      // Make sure password has been removed
      assert.ok(!user.password);
    });
  });
});

async function makeClient(host, port, email, password) {
  const client = feathersClient();
  const socket = io(`http://${host}:${port}`, {
    transports: ['websocket'],
    forceNew: true,
    reconnection: false,
    extraHeaders: {}
  });
  client.configure(feathersClient.socketio(socket));
  client.configure(feathersClient.authentication({
    storage: localStorage()
  }));

  await client.authenticate({
    strategy: 'local',
    email,
    password,
  });

  return client;
}

function localStorage() {
  const store = {};

  return {
    setItem(key, value) {
      store[key] = value;
    },
    getItem(key) {
      return store[key];
    },
    removeItem(key) {
      delete store[key];
    }
  };
}

, когда я запускаю npm test последнийдва теста завершились неудачно, как показано ниже:

 1) 'users' service - client
       "before all" hook:
     Error: Socket connection timed out
      at Timeout._onTimeout (node_modules\@feathersjs\client\dist\feathers.js:2534:18)

  2) 'users' service - client
       "after all" hook:
     TypeError: Cannot read property 'logout' of undefined
      at Context.after (test\services\client-users.test.js:37:12)

Я думаю, что logout один только потому, что клиент не смог установить соединение с сокетом на 1)

Уведомление, которое я пытался закомментироватьвесь файл app.test.js (который является другим местом, где есть оператор инициализации приложения, который, я думаю, может быть связан с этой проблемойвсе файл app.test.js, тест на client-users.test.js работал нормально.

Мой вопрос: почему произошла эта магия и как ее исправить? Спасибо, ребята.

...