单元测试 POST HTTP 请求 - 如何期望随请求一起发送的对象成为 api URL 的一部分

Unit testing a POST HTTP Request - how to expect the object that gets sent with request to be part of the api URL

我正在尝试为服务创建一个简单的单元测试。该服务进行 HTTP POST 调用并向服务器发送一个小对象。我只想测试以确保 API Url、apiUrl 被正确调用为 POST。但是,Jasmine 在实际发送 URL + 数据的地方期望 URL 本身。但是我不知道如何将数据考虑在内。

来自茉莉花:

Expected spy HttpClient.post to have been called with 
[ 'https://localhost:56431/v2/Templates/function () { return fn.apply(this, arguments); }/Folder/321/Preview' ] 

but actual calls were 

[ 'https://localhost:56431/v2/Templates/function () { return fn.apply(this, arguments); }/Folder/321/Preview', Object({ groupId: '-', inviteMessage: '-' }) ].

我想我可以将对象直接附加到 apiUrl toHaveBeenCalledWith 但是有没有更简洁的方法来实现这一点?

我的服务class:

export class TemplateService {
    apiUrl: string;

    constructor(private httpClient: HttpClient, private defaultService: defaultService) {}

    getTemplate(folderId: string, groupId = '', message = ''): Observable<Template> {
        let info = {
            'groupId': groupId,
            'inviteMessage': message
        };
        this.apiUrl = `${environment.base}/v2/Templates/${this.defaultService.currentAccountNumber}/Location/${folderId}/Preview`;
        return this.httpClient.post<Template>(this.apiUrl, info);
    }
}

单元测试:

describe('TemplateService', () => {

    let httpClient: HttpClient;
    let service: EmailService;
    let defaultService: defaultService;

    beforeEach(() => {
        httpClient = jasmine.createSpyObj(
            'HttpClient',
            {
                post: observableFrom([
                    [
                        { body: '<h1>test</h1>', subject: 'Documents' }
                    ]
                ])
            });

        siteDefaultsService = jasmine.createSpyObj('defaultService', { currentAccountNumber: '123' });
        service = new TemplateService(httpClient, siteDefaultsService);
    });

    describe('post', () => {

        it('should make request to api url', done => {
            service.getTemplate('321', '-', '-').subscribe(results => {
                expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl);
                done();
            });
        });
    });
});

您可以尝试使用 jasmine.anyjasmine.objectContaining:

expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.any(Object));

expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.objectContaining({ groupId: '-', inviteMessage: '-' }));