如何将任何 URL 与 HttpTestingController.expectOne 匹配?

ste*_*eve 5 unit-testing angular

expectOne()需要一个 URL 字符串来匹配被测代码通过HttpClient. 但是,我想要单独的测试来验证请求 URL 和验证结果数据。我想要一个测试来验证请求 URL——忽略结果数据——我可以写。我想要另一个测试来验证结果数据——不管 URL 是什么——我不能写,因为expectOne需要 URL 参数匹配。

我搜索了一种告诉expectOne忽略 URL 或匹配任何 URL 的方法,但一无所获。我确实尝试过'*',但这没有用。

有没有办法HttpTestingController匹配任何 URL?

import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';

import { OperationsLogService } from './operations-log.service';
import { Severity } from './severity.enum';

describe('OperationsLogService', () => {
    let service: OperationsLogService;
    let httpMock: HttpTestingController;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientTestingModule
            ],
            providers: [
                OperationsLogService
            ]
        });

        service = TestBed.get(OperationsLogService);
        httpMock = TestBed.get(HttpTestingController);
    });
    it('requests by page and max-count', (done) => {
        service
            .getEntries(3, 5)
            .subscribe((res: any) => {
                done();
            });
        const request = httpMock.expectOne('api/operations-log/oplog.json?page=3&max-count=5');
        request.flush({});
        httpMock.verify();
    });
    it('provides entries', (done) => {
        const entries = [
            {
                severity: Severity.Informational,
                whenLogged: Date.now(),
                code: 123,
                message: 'msg'
            }
        ];
        service
            .getEntries(3, 5)
            .subscribe((res: any) => {
                expect(res).toEqual(entries);
                done();
            });
        // don't want to specify the URL here
        const request = httpMock.expectOne('api/operations-log/oplog.json?page=3&max-count=5');
        request.flush(entries);
        httpMock.verify();
    });
});
Run Code Online (Sandbox Code Playgroud)

为什么我想要这个功能:测试应该相互独立。一个问题/更改应该导致尽可能少的测试失败。如果 URL 测试失败,那么我不希望其他测试(提供条目)失败。有人建议我将 URL 存储在一个公共变量中。这确实消除了代码重复,但测试仍然很弱。如果一个失败(由于 URL 改变),它们都会失败。

小智 6

有一个过载可以满足expectOne()您的需求(请参阅https://angular.io/api/common/http/testing/HttpTestingController#expectone 上的文档):

abstract expectOne(matchFn: ((req: HttpRequest<any>) => boolean), description?: string): TestRequest
Run Code Online (Sandbox Code Playgroud)

因此,为了让您的测试匹配任何 URL,只需true在每次调用 match 谓词时返回:

const request = httpMock.expectOne(() => true);
request.flush(entries);
Run Code Online (Sandbox Code Playgroud)