单元测试 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.any
或 jasmine.objectContaining
:
expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.any(Object));
或
expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.objectContaining({ groupId: '-', inviteMessage: '-' }));
我正在尝试为服务创建一个简单的单元测试。该服务进行 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.any
或 jasmine.objectContaining
:
expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.any(Object));
或
expect(httpClient.post).toHaveBeenCalledWith(service.apiUrl, jasmine.objectContaining({ groupId: '-', inviteMessage: '-' }));