Можно ли избежать запуска SignalR при тестировании Angular / Jasmine? - PullRequest
0 голосов
/ 25 сентября 2018

Итак, у меня есть приложение Angular 6, которое взаимодействует с серверной частью .Net Core 2.1 и использует пакет @ aspnet / signalr npm (версия ^ 1.0.3).Я построил сервис Angular для размещения кода SignalR.

То, что я пытаюсь сделать, потому что я не тестирую SignalR (пока) в моих тестах Angular / Jasmine, - это написать код, который по сути говорит: «если этот сервис работает в контексте Angular /Тестирование Жасмин, затем не пытайтесь запустить код, который подключается к концентратору SignalR. "

Мой код для взаимодействия с SignalR со стороны клиента выглядит так (в конструкторе моего сервиса):

this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl(this.rootUrl)
.build();

this.hubConnection
.start()
.then(() => console.log('Connection started!'))
.catch(err => console.log('Error while establishing connection :('));

this.hubConnection.on('sendToAll', (sr_senderName: string, receivedMessage: string) => {
  const text = `${receivedMessage}`;
  this.add(sr_senderName, text, false);
});

В контексте запуска моего приложения все работает нормально, а SignalR работает отлично.

Однако, когда я пытаюсь запустить "тест ng", т.е. в контексте запуска моегоТесты Жасмин, я получаю ошибки, подобные этой в консоли:

Не удалось загрузить http://localhost:9017/eventHub/negotiate: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: Нет заголовка «Access-Control-Allow-Origin»присутствует на запрашиваемом ресурсе.Следовательно, Origin 'http://localhost:9876' не имеет доступа.

Итак, я понимаю, что это, очевидно, проблема CORS, поэтому я попытался изменить ее на стороне .Net Core, чтобы разрешить происхождение CORS:

            builder.WithOrigins("http://localhost:4200", "http://localhost:9876")
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowCredentials();

И это устраняет ошибки в консоли браузера.На данный момент это нормально, и я сделаю это как временную меру, но она все еще не совсем идеальна.

Я думал о каком-то хаке в коде Angular, например, попробуйте обнаружить контекст, и если он находится вконтекст запуска тестов, вместо запуска реального приложения, затем не пытайтесь подключиться;но я не смог заставить это работать (например, пытаться смоделировать Маршрутизатор или Местоположение в моих тестах Angular), но в любом случае это кажется немного уродливым.

Мне просто интересно, есть ли более элегантное решение для этого.

...