Как использовать пользовательские сопоставления при использовании toHaveBeenCalledWith в тесте жасмин? - PullRequest
0 голосов
/ 31 мая 2018

Следующий тестовый пример проверяет, действительно ли служба (которая использует Angular HttpClient для выполнения пост-запроса) действительно использует определенные заголовки.

Я хочунаписать некоторый пользовательский код соответствия, чтобы проверить, содержат ли заголовки определенный ключ и значение, например:

headers.get('Session') === 'abc'

Мой вопрос: что написать в ??? в приведенном ниже примере?

spyOn(http, 'post').and.returnValue(new Observable<Response>());

const result = service.Post<string>(data);

assert.isNotNull(result);

expect(http.post).toHaveBeenCalledWith(`http://localhost/odata/Employees`, jasmine.any(String),
    {
        headers: // ???,
        observe: 'response'
    });

Возможно ли это?

1 Ответ

0 голосов
/ 05 июня 2018

Я создал этот класс соответствия:

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

...