Javascript 不使用';t返回但调用其他函数

Javascript 不使用';t返回但调用其他函数,javascript,angularjs,unit-testing,jasmine,karma-jasmine,Javascript,Angularjs,Unit Testing,Jasmine,Karma Jasmine,我正在做一个使用angularjs(1.x)作为框架的项目。在这个项目中,我有一个web界面,我提出了一些后端请求。我觉得有必要为这个工具编写测试。所以,我开始为此编写单元测试用例。但是现在,我还不能为一些函数编写测试用例。我的问题是: 我正在尝试编写发出后端请求的函数的测试用例,在成功或错误时,我调用其他函数。所以,基本上,这个函数不返回任何东西。那么,我如何测试这个函数呢 代码片段是: public makePutRequest(): void { this.backendServi

我正在做一个使用angularjs(1.x)作为框架的项目。在这个项目中,我有一个web界面,我提出了一些后端请求。我觉得有必要为这个工具编写测试。所以,我开始为此编写单元测试用例。但是现在,我还不能为一些函数编写测试用例。我的问题是:

我正在尝试编写发出后端请求的函数的测试用例,在
成功
错误
时,我调用其他函数。所以,基本上,这个函数不返回任何东西。那么,我如何测试这个函数呢

代码片段是:

public makePutRequest(): void {
    this.backendService.putBackendRequest(url, backendData, config)
    .then((success) => {
        successFunction(success); // function call on success
    }, (error) => {
        errorFunction(error);   // function call on error
    })
}
backendService中的函数是:

public putBackendRequest(url, backendData, config){
    let defered = this.$q.defer();
    this.$httpService.put(url, backendData, config)
        .success((data, status, headers, config): void => {
            if (status === 200) {
                // do some further manipulation with data.
            }
            return defered.resolve(data);
        })
        .error((data, status, headers, config): void => {
            if (status === 500) {
                // do some other manipulation.
            }
            return defered.reject(data);
        });
    return defered.promise;
}
我正在编写单元测试用例,使用karma作为测试运行者,jasmine作为测试框架,angularjs(1.x)作为框架

现在,我不知道如何为函数
makePutRequest
编写测试用例,因为它正在得到
promise
,在
resolve
上它正在调用一个函数,在
reject
上它正在调用另一个函数

我是用angularjs编写单元测试的新手。任何有用的建议都会非常有用


谢谢

您想为backendService构建一个双精度测试。双重测试将根据您的指令简单地拒绝或解决。您没有提到您正在使用的单元测试框架,但是您可以手动构建一个双重测试,或者从您的单元测试中使用一个模拟框架来生成一个以您想要的方式响应的双重测试。一些测试库,比如Jasmine,能够创建内置的测试加倍

下面是一个为同一类型的服务(调用后端的服务)手动构建的双重测试的示例。您需要某种机制将test double注入调用服务的测试代码中。在下面的示例中,我使用构造函数依赖项注入

正在测试的类是“App”。应用程序调用的依赖项/服务称为“Api”。在下面的示例中,我正在测试应用程序从服务返回的已解析承诺中成功接收数据后,是否会适当更新应用程序上的状态

  it('loads drugs when attached to dom', function(done) {

    let response = new Response(JSON.stringify(
      [{drugId : "1", name: "drug1", classifications : []}]
    ));

    let fetchPromise = new Promise(function(resolve) {
      resolve(response.json());
    });

    let mockApi = { getDrugs : function() {
      return fetchPromise;
    }};

    let app = new App(mockApi);

    app.attached();

    fetchPromise.then( function() {
      expect(app.availableDrugs.length).toBe(1);
      expect(app.availableDrugs[0].drugId).toBe("1");
      expect(app.availableDrugs[0].name).toBe("drug1");
      done();
    });
  });

您想为backendService构建一个双精度测试。双重测试将根据您的指令简单地拒绝或解决。您没有提到您正在使用的单元测试框架,但是您可以手动构建一个双重测试,或者从您的单元测试中使用一个模拟框架来生成一个以您想要的方式响应的双重测试。一些测试库,比如Jasmine,能够创建内置的测试加倍

下面是一个为同一类型的服务(调用后端的服务)手动构建的双重测试的示例。您需要某种机制将test double注入调用服务的测试代码中。在下面的示例中,我使用构造函数依赖项注入

正在测试的类是“App”。应用程序调用的依赖项/服务称为“Api”。在下面的示例中,我正在测试应用程序从服务返回的已解析承诺中成功接收数据后,是否会适当更新应用程序上的状态

  it('loads drugs when attached to dom', function(done) {

    let response = new Response(JSON.stringify(
      [{drugId : "1", name: "drug1", classifications : []}]
    ));

    let fetchPromise = new Promise(function(resolve) {
      resolve(response.json());
    });

    let mockApi = { getDrugs : function() {
      return fetchPromise;
    }};

    let app = new App(mockApi);

    app.attached();

    fetchPromise.then( function() {
      expect(app.availableDrugs.length).toBe(1);
      expect(app.availableDrugs[0].drugId).toBe("1");
      expect(app.availableDrugs[0].name).toBe("drug1");
      done();
    });
  });

你有没有试着模仿你的请求call@ukn:我正在为makePutRequest函数编写测试用例。为什么我要模拟那个函数?我的错,我在考虑模拟putBackendRequest,但我写了makePutRequest。@ukn:你能详细说明一下,模拟putBackendRequest函数对我有什么帮助吗?你将能够测试什么是重要的。在这里,您想测试当您获得成功或错误时会发生什么。其他地方发生了什么并不重要。因为你的函数没有返回任何东西,你应该测试它的副作用。你有没有试着模仿你的makePutRequestcall@ukn:我正在为makePutRequest函数编写测试用例。为什么我要模拟那个函数?我的错,我在考虑模拟putBackendRequest,但我写了makePutRequest。@ukn:你能详细说明一下,模拟putBackendRequest函数对我有什么帮助吗?你将能够测试什么是重要的。在这里,您想测试当您获得成功或错误时会发生什么。其他地方发生了什么并不重要。因为你的函数没有返回任何东西,你应该测试一下副作用是什么。仔细阅读这个问题总是好的。我特别提到我使用jasmine作为测试框架。另外,我正在为makePutRequest函数编写测试用例,但不是BackEndServicePutBackEndRequest函数仔细阅读问题总是很好的。我特别提到我使用jasmine作为测试框架。另外,我正在为makePutRequest函数编写测试用例,但不是backendService的putBackendRequest函数