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)
| 归档时间: |
|
| 查看次数: |
4911 次 |
| 最近记录: |