如何覆盖 Jasmine for Angular7 Promises 中的模拟方法

How to get coverage for mocked methods in Jasmine for Angular7 Promises

Jasmine 测试 angular 7 服务,returns Promise 对象未反映在代码覆盖率中。

@Injectable()
export class MyService {
constructor(private http:HttpClient,private httpService: HttpService) { 
}

getAllRecords (requestData: MyRequest): Promise<MyResponse> {
    return new Promise((resolve, reject) => {
        let url:string = `${ApiUrl.getUrl}`;
        this.httpService.makeHttpGetRequest(url, requestData)
        .subscribe((response) => {
            resolve(response.body);
        }, (error) => {
            reject();
        });
    });
}
}

测试

describe('MyService', function () {
let myService: MyService;
it('getAllRecords should have been called and return all records', (done) => {
        const spy = spyOn(myService, 'getAllRecords').and.returnValue(Promise.resolve({ id: 1 }));

        myService.getAllRecords(null);
        spy.calls.mostRecent().returnValue.then(() => {


            expect(myService.getAllRecords).toHaveBeenCalledWith(null);
            done();
        });
    })
})

测试通过但未反映在使用 Istanbul 创建的代码覆盖率报告中,评论测试未反映代码覆盖率。

你在声明时存根方法:

const spy = spyOn(myService, 'getAllRecords').and.returnValue(Promise.resolve({ id: 1 }));

方法本身将永远不会被输入,因为您的间谍 return代表它有一个不同的值。

我建议不要在 myService.getAllRecords() 上设置 spy,而是在 httpService.makeHttpGetRequest() 和 return 上设置 spy 一个冷的可观察对象,它会立即完成各种值来测试快乐路径和错误案例。