Javascript 测试返回http可观测值的方法的正确方法是什么?

Javascript 测试返回http可观测值的方法的正确方法是什么?,javascript,typescript,jasmine,rxjs,karma-jasmine,Javascript,Typescript,Jasmine,Rxjs,Karma Jasmine,我有一个TypeScript项目,我想将其部署为JS NPM包。这个包使用rxjsajax函数执行一些http请求。现在我想为这些方法编写测试 在某种程度上,我有这样一种方法(简化了!): 我想不出另外一种方法来做异步工作…您需要模拟ajax。get返回一个可观察的对象,该对象发出您想要测试的值 这取决于在包含user.getAllUsers方法的文件中如何声明ajax 如果UsersApi()将ajax传递给它(纯函数样式),这将是理想的选择,因为这样您就可以执行如下操作: const s

我有一个TypeScript项目,我想将其部署为JS NPM包。这个包使用rxjsajax函数执行一些http请求。现在我想为这些方法编写测试

在某种程度上,我有这样一种方法(简化了!):


我想不出另外一种方法来做异步工作…

您需要模拟
ajax。get
返回一个可观察的对象,该对象发出您想要测试的值

这取决于在包含
user.getAllUsers
方法的文件中如何声明
ajax

如果
UsersApi()
ajax
传递给它(纯函数样式),这将是理想的选择,因为这样您就可以执行如下操作:

  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();
       });

    });

  });
e、 g

编辑:传递依赖项(AKA依赖注入)是使这样的模块更容易测试的一件事——考虑做它!p> 然后您可以很容易地模拟您的测试,如下所示:

  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始终返回200秒,您将如何测试失败的API响应是否由您的代码正确处理

编辑#27:当我运行jest时,上面的代码对我来说很好,不完全清楚为什么jasmine(jest不是在jasmine上运行吗?)说它不能在
it
中执行异步。在任何情况下,您都可以更改上面的代码,在beforeach中设置所有内容,然后在
it
中执行
expect
s

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();
       });

    });

  });