2017-04-21 55 views
0

我有以下应该测试一个服务的角度(4)测试,但是,它似乎在Observable返回和expect得到命中之前通过。在异步调用完成之前传递的角度测试?

it('should enter the assertion', inject(
     [ MockBackend, CellService ], 
     (backend: MockBackend, s: CellService) => { 
      const urls = []; 

      backend.connections.subscribe((connection: MockConnection) => { 
       const req = connection.request; 
       urls.push(req.url); 
       if (req.method === RequestMethod.Get && req.url === '/api/getTest') { 
        connection.mockRespond(new Response(new ResponseOptions('enter mocked content'))); 
       } 
      }); 
      s.getCell('powders').subscribe(val => expect(true).toBeFalsy()) 
     }) 
    ); 

我试着加入异步/等待,但是没有什么区别。我怎样才能做到这一点?

更新:

此代码经过太...

it('should enter the assertion', async(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     const urls = []; 

     backend.connections.subscribe((connection: MockConnection) => { 
      const req = connection.request; 
      urls.push(req.url); 
      if (req.method === RequestMethod.Get && req.url === '/api/getTest') { 
       connection.mockRespond(new Response(new ResponseOptions('enter mocked content'))); 
      } 
     }); 
     s.getCell('powders').subscribe(val => expect(true).toBeFalsy()) 
    }) 
)); 

回答

2

裹测试中角的async

import { async } from '@angular/core/testing'; 

         ---==== vvvv ===---- 
it('should enter the assertion', async(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     ... 
    }) 
)); 

这将包装测试在测试区,这将使Angular在实际完成测试之前等待所有异步任务完成。

参见:

UPDATE

与尝试fakeAsycn/tick

import { fakeAsync } from '@angular/core/testing'; 

it('should enter the assertion', fakeAsync(inject(
    [ MockBackend, CellService ], 
    (backend: MockBackend, s: CellService) => { 
     ... 

     let value; 
     s.getCell('powders').subscribe(val => { 
      value = val; 
     }) 
     tick(); 
     expect(val).toBeTruthy(); 
    }) 
)); 

应该async工作,但使用fakeAsync使得它有点更容易调试,因为每一件事情是同步的。

如果它仍然不起作用,那么你可能需要检查其他地方的逻辑。其中一个检查我会在这里

req.method === RequestMethod.Get && req.url === '/api/getTest' 

你确定这两个通过?否则,将不会有任何回应。

+0

的参数见我更新的问题,我想这种做法,我仍然没有看到预期的行为,我做了什么了吗? –

+0

查看我的更新。确保条件通过。否则,将不会有任何回应。 –

0

我宁愿在这里使用Jasmine done()回调。

首先,在规格中除掉喷油器,并在beforeEach部分使用TestBed.get(serviceToken)

其次,一遍完成的规范功能

it('should use asynchronous', done => { 
    s.method().subscribe(result => { 
    expect(result).toBe(...); 
    done(); 
    } 
}) 
相关问题