【问题标题】:unit test case for a function which doesn't returns but calls other function不返回但调用其他函数的函数的单元测试用例
【发布时间】:2017-05-15 18:36:42
【问题描述】:

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

我正在尝试编写发出后端请求的函数的测试用例,并且在 successerror 上,我正在调用其他函数。所以,基本上,这个函数没有返回任何东西。那么,我该如何测试这个功能呢?

代码sn-p是:

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 编写单元测试的新手。任何有用的建议都会很有帮助!

谢谢

【问题讨论】:

  • 你有没有尝试模拟你的 makePutRequest 调用
  • @ukn:我正在为 makePutRequest 函数编写测试用例。我为什么要模拟那个函数?
  • 我的错,我想模拟 putBackendRequest 但我写了 makePutRequest。
  • @ukn:你能详细说明一下,模拟 putBackendRequest 函数对我有什么帮助吗?
  • 您将能够测试重要的内容。在这里,您想测试获得成功或错误时会发生什么。其他地方发生什么并不重要。由于你的函数没有返回任何东西,你应该测试一下副作用是什么。

标签: javascript angularjs unit-testing jasmine karma-jasmine


【解决方案1】:

您想为 backendService 构建一个测试替身。测试替身将按照您的指示简单地拒绝或解决。您没有提到您正在使用什么单元测试框架,但是您可以手动构建一个测试替身,或者使用单元测试中的模拟框架来制作一个以您想要的方式响应的测试替身。一些测试库,比如 Jasmine,内置了创建测试替身的能力。

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

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

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

【讨论】:

  • 仔细阅读问题总是好的。我特别提到我使用 jasmine 作为测试框架。另外,我正在为 makePutRequest 函数编写测试用例,而不是 backendServiceputBackendRequest 函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2017-05-26
  • 1970-01-01
相关资源
最近更新 更多