我有以下angular(4)测试应该测试服务,但是,它似乎在Observable返回之前传递并且 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 / await,但这并没有什么区别。我怎么能这样做?
更新
此代码也通过了......
{{1}}
答案 0 :(得分:2)
将测试包裹在Angular的async
import { async } from '@angular/core/testing';
---==== vvvv ===----
it('should enter the assertion', async(inject(
[ MockBackend, CellService ],
( backend: MockBackend, s: CellService ) => {
...
})
));
这将把测试包装在测试区中,这将允许Angular在完成测试之前实际等待所有异步任务完成。
另见:
使用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'
你确定这两个都通过了吗?如果没有,就没有回应。
答案 1 :(得分:0)
我更喜欢在这里使用Jasmine done()
回调。
首先,在规范中删除注入器并使用TestBed.get(serviceToken)
部分中的beforeEach
。
其次,传递完成为spec函数的参数
it('should use asynchronous', done => {
s.method().subscribe(result => {
expect(result).toBe(...);
done();
}
})