在异步调用完成之前传递的角度测试?
问题描述:
我有以下应该测试一个服务的角度(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())
})
));
答
裹测试中角的async
import { async } from '@angular/core/testing';
---==== vvvv ===----
it('should enter the assertion', async(inject(
[ MockBackend, CellService ],
(backend: MockBackend, s: CellService) => {
...
})
));
这将包装测试在测试区,这将使Angular在实际完成测试之前等待所有异步任务完成。
参见:
- Angular 2 Testing - Async function call - when to use
- Test a component with an async service
- What is the difference between fakeAsync and async in angular2 testing
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'
你确定这两个通过?否则,将不会有任何回应。
答
我宁愿在这里使用Jasmine done()
回调。
首先,在规格中除掉喷油器,并在beforeEach
部分使用TestBed.get(serviceToken)
。
其次,一遍完成的规范功能
it('should use asynchronous', done => {
s.method().subscribe(result => {
expect(result).toBe(...);
done();
}
})
的参数见我更新的问题,我想这种做法,我仍然没有看到预期的行为,我做了什么了吗? –
查看我的更新。确保条件通过。否则,将不会有任何回应。 –