16

我有一个非常简单的服务调用和一个茉莉花测试。

服务电话:

myServiceCall(testId: number) : void {
    const url = `${this.url}/paramX/${testId}`;
    this.http.put(url, {},{headers: this.headers}).subscribe();
}

我的测试方法:

it('should call myServiceCall', inject([MyService], (service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
}));

我当然得到一个例外,因为我希望 url 参数是“123”,而不是像在这个测试用例场景中那样未定义。

错误:预期有一个对条件“匹配 URL: http://localhost:8080/myservice/paramX/123 ”的匹配请求,但没有找到。

我不明白的是为什么测试框架说

没有找到

尽管提出了请求。是否有可能让测试框架告诉我进行了哪些其他实际调用,类似于 mockito 的验证?

4

6 回答 6

19

我的问题解决了。在我将参数添加到 URL 之后(如果您使用参数)。

let results = { param: 'results', value: '50' };
url = `${api.url}${route.url}?${results.param}=${results.value}`;

HttpTestingController始终只显示不带参数的 URL,但如果使用expectOne(url)它,则使用带有如下查询字符串的 URL: http ://example.com/path/to/page?name=ferret&color=purple

于 2018-10-10T09:54:56.903 回答
16

您读错了错误,让我为您改写一下:

错误:需要一个匹配的请求 [...],但没有找到。

这仅仅意味着您的 URL 不匹配。

您可以做的是添加您的 URL 的控制台日志

console.log(req.request.url);

或者您可以简单地尝试匹配请求。

其他解决方案:由于您依赖环境变量,因此您可以运行此测试:

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);
于 2018-06-08T08:10:29.243 回答
3

您应该在 fakeAsync 中进行测试,并在测试结束时调用 tick()。喜欢

it('should call myServiceCall', inject([MyService], fakeAsync((service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
    tick();

})));
于 2018-09-12T21:00:27.203 回答
1

您已经在调用httpMock.verify(),如果有意外请求,它应该会失败,并将有关这些请求的一些信息记录到控制台。如果您expectOne因“未发现”而失败,并且verify没有失败,那么您的服务实际上一定没有调用http.put(). 在调试器中添加一些日志记录或逐步完成测试以查看实际发生的情况。

正如其他答案所指出的,这可能是由于时间问题。您的服务调用不会返回 Observable 或 Promise,因此您的规范无法判断它何时完成。这意味着您必须使用waitForAsync或来操纵时间fakeAsync

于 2020-11-26T13:39:42.130 回答
0

这是我用来测试服务的解决方法。

it('should call myServiceCall', (done) => {
        const expectedURL = `/paramX/123`;
        const inputResponse = {id: '123', ...}; // if you want to verify the response
        const expectedResponse = {id: '123', ...}; // if you want to verify the response
        const spy = spyOn<any>(service, 'get').and.returnValue(of(inputResponse));
        let result: any;
        const req = service.myServiceCall().subscribe((t) => {
          result = t;
        });
    
        expect(spy).toHaveBeenCalled();
        expect(spy.calls.mostRecent().args[0]).toEqual(expectedURL);
    
        setTimeout(() => {
          expect(result).toEqual(expectedResponse);
          done();
        }, 1);
      });
于 2021-11-30T07:20:15.843 回答
0

同样在使用 Jest 时 - 确保您使用的是什么环境。环境需要是jsdom。如果不是,并且您不想弄乱全局设置 - 将以下内容添加到您的文件头:

/**
* @jest-environment jsdom
*/
于 2021-08-06T03:25:50.517 回答