在jasmine测试中使用toHaveBeenCalledWith时如何使用自定义匹配器?

时间:2018-05-31 18:10:41

标签: angular post jasmine matcher angular-httpclient

以下测试用例验证服务(使用 Angular HttpClient 执行发布请求)是否确实使用了某些标头。

我想编写一些自定义匹配代码来检查标头是否包含某个键和值,例如:

fact

我的问题是在下面的示例headers.get('Session') === 'abc' 写什么?

???

这可能吗?

1 个答案:

答案 0 :(得分:0)

我创建了这个匹配器类:

class HttpHeadersMatcher {

    constructor(private check: { [name: string]: string }) {
    }

    public asymmetricMatch(options: any): boolean {
        const headers: HttpHeaders = options.headers;

        assert.equal(options.observe, 'response');

        Object.keys(this.check)
            .forEach((key: string) => {
                assert.equal(headers.get(key), this.check[key], `The header '${key}' does not have the correct value`);
            });

        return true;
    }

    public jasmineToString(): string {
        return `<HeaderMatching: ${JSON.stringify(this.check)}>`;
    }
}

使用方法如下:

expect(http.post).toHaveBeenCalledWith(`http://localhost/odata/Employees`, jasmine.any(String), new HttpHeadersMatcher({ 'Session': 'abc' }));

我的项目和示例测试代码也可以在这里找到:angular-odata-es5 : angularODataService.spec.ts