我有一个打字稿项目,我想部署为JS NPM包。这个包进行使用rxjs AJAX功能的某些HTTP请求。现在,我想编写这些方法测试。
在某些时候,我有一个这样的方法(简单!):
getAllUsers(): Observable<AjaxResponse> {
return ajax.get(this.apiUrl + '/users');
}
我知道基本的测试,例如用spyOn
我可以模拟从服务器的响应。但是,如何将我实际测试的http请求?
茉莉的文件说,我不能做异步工作在it
部分,但在beforeEach
:https://jasmine.github.io/tutorials/async
这将是测试API正确的做法?
let value: AjaxResponse;
let error: AjaxError;
beforeEach((done) => {
const user = new UsersApi();
user.getAllUsers().subscribe(
(_value: any) => {
value = _value;
done();
},
(_error: any) => {
error = _error;
done();
}
);
});
it("should test the actual http request", () => {
// Test here something
// expect(value).toBe...
// expect(error).toBe...
});
我想不出的另一种方法如何做异步工作...
您需要模拟ajax.get
返回一个可观察其发射要测试值。
这是依据ajax
是如何在你的文件,其中包含user.getAllUsers
方法宣告完成。
这将会是理想的,如果UsersApi()
已ajax
传递给它(纯函数式的),因为你可能只是做这样的事情:
EG
class UsersApi {
public ajax;
constructor(ajax) {
this.ajax = ajax;
}
getAllUsers() {
return this.ajax.get(....)
}
}
编辑:传递依赖(又名依赖注入)是一个东西,它使模块这样显著更容易测试 - 考虑这样做!
然后,你可以很容易地嘲笑你的测试出来是这样的:
const someSuccessfulResponse = ...
const someFailedResponse = ...
const ajaxWithSuccess = {
get:jest.fn(() => of(someSuccessfulResponse))
}
const ajaxWithFailed = {
get:jest.fn(() => throwError(someFailedResponse))
}
describe('my test suite',() => {
it("should test a successful response", (done) => {
const user = new UsersApi(ajaxWithSuccess);
user.getAllUsers().subscribe(d => {
expect(d).toBe(someSuccessfulResponse);
done();
});
});
it("should test a failed response", (done) => {
const user = new UsersApi(ajaxWithFailed);
user.getAllUsers().subscribe(null,error => {
expect(d).toBe(someFailedResponse);
done();
});
});
});
注意:你不想来测试实际的API请求。你想测试你的代码成功处理任何API响应,你认为它可以接受。想想看,你怎么测试一个失败的API响应由你的代码正确处理,如果你的API总是返回200S?
编辑#27:(?不开玩笑的茉莉花运行)上面的代码工作正常,我当我运行的笑话,为什么茉莉没有完全明确的说,它不能做异步的it
的。在任何情况下,你可以只改变上面的代码中beforeEach设置应有尽有了,只是做你的expect
s在it
的。