gpt4 book ai didi

angularjs - AngularJS HTTP 中的模拟服务

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:26:31 27 4
gpt4 key购买 nike

我正在尝试测试通过服务执行 http 请求的 Controller 。

我应该只模拟服务并返回默认值,而不是执行实际的 http 请求,或者使用 $httpBackend

顺便说一下,我正在 Jasmine 中进行测试。

谢谢。

最佳答案

TL;DR 不要执行实际的 http 请求。

  • 单元测试
    在进行适当的单元测试时,您只测试一个单元。这可以是一个类,也可以只是一个类的一部分。这意味着您必须模拟依赖项。在您的情况下,这意味着您将模拟服务以简单地像类(class)那样行事。所以返回一个包含数据模型的 promise 。
    pro:真正的单元测试的最大优势是速度。您可以执行大量单元测试,而不是单个端到端测试。
    con:单元测试的最大缺点是当您更改依赖项以不同的方式工作时,您的测试仍然会成功,因为该服务已被模拟。
  • 集成测试
    集成测试几乎是单元测试,但在这里您不模拟直接依赖关系。在您的情况下,在进行集成测试时,您不会模拟服务,而是模拟依赖项(使用 $httpBackend)。
    pro:仍然相当快,并提供更强大的测试。因为当您更新直接依赖项时,您测试的类可能会失败,因为它们没有被模拟。
    con:不如单元测试快,但仍然非常快。
  • 端到端
    E2E 测试测试整个应用程序,而不是模拟任何东西。这包括对 api 的所有 XHR 调用。
    pro:因为没有模拟任何东西,它总是覆盖整个应用程序。跟踪 DOM 更改和浏览器兼容性非常有用。它甚至可以自动截取屏幕截图以提供渲染数据的真实 View 。
    缺点:它很慢。因为它执行实际的 API 调用,所以这些测试可能需要一段时间才能执行。

所以要回答你的问题,这取决于你在写什么。当您编写适当的单元测试时,您应该模拟该服务:

$provide.service('DataService', ['$q', function($q) { 
this.get = function() {
return $q(function(resolve, reject) {
if (requestFailed) {
reject('The request failed');
}

resolve(APIData);
});
};
}]);

如果您正在进行集成测试,您应该使用 $httpBackend 模拟实际的 $http 请求。

it('should request data', function() {
$httpBackend
.expect('GET', url)
.respond(APIData);

expect($scope.list.count).toEqual(0);

$scope.clickRetrieve();
$httpBackend.flush();

expect($scope.list.count).toBeGreaterThan(0);
});

我正在开发一个相当大的应用程序,但在测试方面没有太多经验。但到目前为止,我最喜欢的测试类型是集成测试。由于模拟服务,我遇到了一些单元测试问题,这些问题没有揭示重大变化。因为我几乎已经切换到集成测试,我几乎只模拟我的数据服务。

旁注:我使用数据服务作为我的应用程序和 API 之间的层,如果 API 更新,理论上我应该只更新数据服务,因为没有除了存储库之外的类访问这些。这样我可以确保在我的应用程序中我只使用数据模型而不是简单的对象,并且我使用 undefined,而不是 null

关于angularjs - AngularJS HTTP 中的模拟服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431888/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com