当前位置: 首页 > 面试题库 >

E2E模拟$ httpBackend实际上没有通过

萧宣
2023-03-14
问题内容

尽管我相信我正在遵循此处的说明来设置$
httpBackend以将选定的请求传递到服务器,但它对我而言不起作用。

这是一个测试失败的Plunkr,
它显示了我在做什么,并在注释中解释了似乎出错的地方。

我的观点表明,由于某种原因,该模拟$httpBackend没有真实的内部副本,$httpBackend因此,当需要传递XHR请求时,它会将其传递给模拟$httpBackend。第二个调用引发异常,因为它不知道如何处理请求。

对dtabuenc的回应

我很高兴地记得您在中途测试中的帖子。您确定了介于单元测试和E2E测试之间的重要集成测试范围。我站在那中间。

我认为您一点都不傻。您的答案是完全合理的……或者与“ API参考/ ngMockE2E / $
httpBackend ”
的文本不矛盾,这 是合理的
。我引用:

此实现可用于通过whenapi及其快捷方式(whenGETwhenPOST等)响应静态或动态响应,并有
选择地将请求传递给真实$httpBackend的特定请求(例如,与某些远程api交互或从网络服务器获取模板)

在端到端测试方案中, 或者在开发使用真实后端api替代了模拟程序的应用程序的情况下 ,某些类别的请求通常希望绕过模拟程序并
发出真实的http, request
....要使用此行为配置后端,请使用passThroughwhen
的请求处理程序,而不是respond。[emphasis mine]。

该文档没有涉及$httpBackendJasmine环境中E2E
使用的问题。我想不出有什么理由排除它。如果有这种原因,他们应该清楚地说明。认真地讲,谁读过关于 模拟 组件的内容,并且不期望在测试环境中使用它?

我打算要做的就是“ 将请求传递给真实$httpBackend的特定请求,例如与某些远程api交互 ”。除了该组件的非模拟版本之外,“实际的$
httpBackend”可能意味着什么?

我不明白您的主张

ngMocksE2E模块设计用于实际执行角度应用程序的“服务器”端。

“服务器”一词在该页面上恰好出现了3次,没有一次暗示 任何
应用程序代码都将在“服务器”上执行。我不知道在“事物的“服务器”端执行的“实际角度应用程序”是什么意思。

该文档非常清楚,E2E $httpBackend不仅限于E2E测试。它也适用于“ 正在开发的应用程序中,使用真实的api替代了模拟的场景 ”。

这与我 用真实的后端api _ 测试*_ _应用程序的 *_场景仅相差半步 。”

在我的场景中,SUT正在调用从服务器获取数据的组件。我的测试是为了验证此从属组件是否成功发出了对真实后端的此类请求,并将以预期的方式检索或保存数据。这是一个集成测试,无法通过模拟后端的行为来充分满足。

当然,我可以使用模拟XHR响应进行测试(并进行测试),以使组件能够正确响应我 预测 的后端行为。这与验证组件对 实际
后端的行为做出适当响应是不一样的……随着应用程序的发展以及以某种重要方式偏离模拟响应,该行为可能会发生变化。

如果我了解如何将其交换到SUT的代码路径中,我将考虑使用您的中途测试仪。我不。我认为您无法访问发出XHR请求的组件ngMidwayTester。但是我确实知道如果需要的话,如何将真正的XHR助手塞进管道。

此刻我站在这里

要么有人可以展示如何$httpBackend将某些请求传递到服务器(如文档所宣称的那样),要么我将passThrough自己替换为有效的XHR实现。

我更喜欢第一种选择。如果要转到第二篇,我将在此处提供指向它的链接,以使共享我的需求和我对API文档的解释的其他人受益。

我想念第三种方法吗?


问题答案:

以下是的目的的解释$httpBackend那是在ngMockE2E模块。

ngMockE2E根本不设计该模块,也不打算在茉莉花规范中使用该模块。

进行端到端测试时,测试有两个方面。一个是正​​在测试的角度应用程序,另一个是Jasmine规范中包含的角度方案代码。

在E2E测试中,在茉莉花的一面(除了场景运行程序之外)没有角度模块,ng-mocks或任何与角度相关的东西。

ngMocksE2E模块设计用于实际执行角度应用程序的“服务器”端。这样做的主要目的是使我们能够预先响应,从而使集成级UI测试比将每个页面实际转到JSON服务器的速度要快得多。

与一起使用jasmine时ng-mocks,angular始终将$
httpBackend替换为模拟后端。添加ngMocksE2E模块时,它将无法获得任何“真实”的信息$httpBackend,并且您已经发现,将包装模拟并将其委托给传递对象。

您尝试编写的测试似乎是不测试UI集成,但测试应用程序javascript和服务器集成的测试。

这是完全合法的测试样式(在angular社区中称为“ midwayTesting”)。您的问题是您使用了错误的工具。

我来看一下:

https://github.com/yearofmoo/ngMidwayTester

为了方便我假设要进行的测试,您将使用而不是angular-mocks和angular.module()。

你可以在这里读更多关于它的内容:

http://www.yearofmoo.com/2013/01/full-spectrum-testing-with-angularjs-and-
karma.html

(很抱歉,如果您已经在那里链接了)

编辑:( 以解决其他评论)

您有一个真正的牛肉,因为文档不清晰,ngMockE2E无法在端到端测试设置的客户端(即业力/茉莉花)端使用。像解释事物一样解释事物并不是没有道理的,但这并没有改变解释错误的事实。

如果在应用程序的服务器端而不是客户端上使用ngMockE2E,则如果有指示,它将通过请求。这意味着您仍然可以通过某些难以模仿的请求(如罐头响应)。客户端和服务器端的意思是,在端到端测试中有两个目的。您拥有由标准应用程序服务器提供服务的待测试应用程序,并且具有驱动通常在Karma或其他测试运行程序中运行的应用程序的测试代码,这些代码使用标准HTTP请求与在Windows
Server 2003中执行的应用程序进行通信另一个过程。

如果您查看文档以及如何设置,ngMockE2E您会发现没有提到Jasmine,而说明是关于如何在实际的角度应用程序中进行设置的:

myAppDev = angular.module('myAppDev', ['myApp', 'ngMockE2E']);
myAppDev.run(function($httpBackend) {
  phones = [{name: 'phone1'}, {name: 'phone2'}];

  // returns the current list of phones
  $httpBackend.whenGET('/phones').respond(phones);

  // adds a new phone to the phones array
  $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
    phones.push(angular.fromJson(data));
  });
  $httpBackend.whenGET(/^\/templates\//).passThrough();
  //...
});

如您在本示例中看到的,他们正在模拟所有JSON数据指令,同时仍然允许其从服务器获取模板。

为了从茉莉花中使用它,设置会大不相同,先使用angular.mock.module('ngMockE2E'),然后在$httpBackend.whenGET()beforeEach()而不是在中进行设置module.run()

ngMidwayTester我所知,实际上,这与兼容ngMockE2E。本质上是ngMidwayTester替换angular.mock.module()inject()具有其自己的实现。因此,您可以像这样使用它:

beforeEach(function(){
  tester = ngMidwayTester('app', 'ngMockE2E');
  $http = tester.inject('$http');
  $httpBackend = tester.inject('$httpBackend');
  $rootScope = tester.inject('$rootScope');
});

这应该可行,因为您不再使用ngMock模块(使用时会始终包含该模块angular.mock.module())。事情应该完全像您希望它们使用那样工作ngMidwayTester



 类似资料:
  • 我已经通过StackOverflow上的帖子。 想要但没有被调用:实际上,这个模拟没有任何交互。 我确实做了被要求的事情,但我仍然错过了一些东西。你能帮帮我我错过了什么吗? 我的Java代码: 我的单元测试: 一切正常工作,除了我得到错误作为

  • 我尝试了例外情况下给出的解决方案:mockito想要但没有调用,实际上与这个mock没有任何交互,而这个mockito也想要但没有调用:实际上,与这个mock没有任何交互但仍然得到相同的错误。我是不是漏掉了什么?以下是me的实现:-

  • MyDriveRepository.getMyDriveItemSelectedPathuri一直返回null。我试着查看以下链接,但没有找到解决问题的方法。

  • 问题内容: 我有一个茉莉花测试,其编码如下: 确实可行,但出现错误: 我确实意识到我可以嘲笑其他所有电话。但是,可以说我不在乎我的测试还要加载什么,因为它可能会调用其他一些东西。我如何确保其他所有请求只是“默默发生”,也许对其他所有请求都提供一个虚拟响应? 问题答案: 测试失败,因为发出了您未指定的请求。 尝试添加: 当然,您还应该定义。 另请参阅文档(“要求期望与后端定义”部分),其中说: 请求

  • 我正在尝试单元测试一个类。课程安排如下 我的productService类如下 当我运行上面的测试案例时, 我得到了mockito想要的,但没有被调用,实际上这个mock没有任何交互。但传递给convertAndSend方法match的参数可以提供一些解决方案。

  • 我使用硒网格(在4个浏览器上运行测试:FF13、FF16、IE9和chrome。每个浏览器都在不同的机器上。在测试的相关部分,我找到一个可点击的元素并单击它。在FF13、IE9和chrome上,它工作得很好:元素被找到并被点击。在FF16上,找到了该元素,并且webdrier“声称”它点击了它,但按钮的动作(改变页面上表格的布局)不会发生。 注意:我使用版本2.25谢谢,Tizki