什么被认为是测试返回HTTP观测方法正确的方法是什么?

问题描述 投票:1回答:1

我有一个打字稿项目,我想部署为JS NPM包。这个包进行使用rxjs AJAX功能的某些HTTP请求。现在,我想编写这些方法测试。

在某些时候,我有一个这样的方法(简单!):

getAllUsers(): Observable<AjaxResponse> {
    return ajax.get(this.apiUrl + '/users');
}

我知道基本的测试,例如用spyOn我可以模拟从服务器的响应。但是,如何将我实际测试的http请求?

茉莉的文件说,我不能做异步工作在it部分,但在beforeEachhttps://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...

});

我想不出的另一种方法如何做异步工作...

javascript typescript jasmine rxjs karma-jasmine
1个回答
2
投票

您需要模拟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设置应有尽有了,只是做你的expects在it的。

© www.soinside.com 2019 - 2024. All rights reserved.