angular - 使用 socket.io 模型对 Angular 5 进行单元测试

标签 angular typescript unit-testing socket.io jasmine

我正在尝试对具有 socket.io 的服务进行单元测试使用 mock-socket 导入。我查看了类似的问题,例如 this一个,我无法让它与以下一起工作。

import { TestBed, inject, async } from '@angular/core/testing';
import { SocketIO, Server } from 'mock-socket';
import { BackendService } from './backend.service';

  describe('BackendService', () => {

  /* setup for mock-socket in order to test socket.io */
  const SERVER_URL = window.location.host;
  const mockServer = new Server(SERVER_URL);

  // setting up server mock
  mockServer.on('connection', socket => {
    mockServer.emit('server-message', 'test message 1');
  });

  beforeEach(() => {

    TestBed.configureTestingModule({
        imports: [ ],
        providers: [ BackendService ]
    });

    jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;

  });

  it('tests simple connection and messaging works with mock-socket setup', async(inject([BackendService], (service: BackendService) => {

  (window as any).io = SocketIO;  

  // setting up client
  service.socket = io(window.location.host);

  setTimeout(() => {
      service.socket.on('connect', (message) => {
          expect(message).toEqual('test message 1');
          mockServer.stop();
      });  
  }, 100);

  })));

});

有人遇到过这个问题吗?

我创建了一个 Stackblitz重新创建场景(如果它能让事情更容易理解)。

最佳答案

我通过更改为以下几行解决了我的问题:

  it('tests simple connection and messaging with mock-socket setup', async(done: DoneFn) => {

  (window as any).io = SocketIO;  

  // setting up client
  backendService.socket = io(window.location.host);


  backendService.socket.on('server-message', (message) => {
    console.log(message)
    expect(message.message).toEqual('test message 1');
    mockServer.stop();
    done();
  });  

  });

});

问题本身是由于您需要在asynchronous时通知Jasmine操作完成。

这是一个工作stackblitz查看测试是否有效。

关于angular - 使用 socket.io 模型对 Angular 5 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51205639/

相关文章:

angularjs - 如何使用 typescript 制作 Angular 服务?

c# - visual studio 2010 c# 单元测试

unit-testing - 是否有与 NUnit 的 testcase 属性等效的 JUnit?

java - 为什么 .equals() 在比较两个对象时会导致断言错误……但只是有时?

angular - 为什么 rxjs 的 mergeMap 将数组变成单独的对象

javascript - 我怎样才能加快这个过滤方法?

typescript - 将 RequireJS 与 TypeScript 结合使用并保留智能感知

css - Ng-Bootstrap active 药丸添加下拉不显示

php - Angular 推送消息未显示

reactjs - 尝试使用 react-redux 分派(dispatch)操作时,类型 'PropsWithChildren' 上不存在 Prop