Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 使用$httpBackend延迟响应_Angularjs_Mocking_Protractor_Httpbackend - Fatal编程技术网

Angularjs 使用$httpBackend延迟响应

Angularjs 使用$httpBackend延迟响应,angularjs,mocking,protractor,httpbackend,Angularjs,Mocking,Protractor,Httpbackend,在我的视图中,在收到API的响应之前,会一直显示加载动画 //Displayed before we've received API response <p ng-if="vm.vehicles == null">Loading ...</p> //Displayed once we received response for the API <table ng-if="vm.vehicles"> <tr ng-repeat="vehicle.

在我的视图中,在收到API的响应之前,会一直显示加载动画

//Displayed before we've received API response
<p ng-if="vm.vehicles == null">Loading ...</p>

//Displayed once we received response for the API
<table ng-if="vm.vehicles">
    <tr ng-repeat="vehicle.vm.vehicles">...</tr>
问题

我想写一个测试来检查加载动画是否显示

我试过:

expect(ptor.isElementPresent(By.cssContainingText('p', 'Loading'))).to.eventually.be.true;`
但我没有通过。因此,我认为我需要有条件地延迟从$httpBackend获得的响应

我找到了这篇博文

然而,插入这个config方法会使我的所有测试失败(我认为是因为没有及时加载模板),它会延迟所有响应,所以这不是我真正需要的


那么,我怎样才能延迟那一个电话的回复呢?理想情况下,我只想推迟测试。

看看文档,尤其是
拦截器

这是有趣的一点:

response
:使用http响应对象调用拦截器。该函数可以自由修改响应对象或创建新对象。函数需要直接返回响应对象,或者作为包含响应或新响应对象的
承诺

换句话说,您可以拦截响应,而不是立即返回响应,而是返回一个承诺,该承诺将在超时后返回响应

e、 g

但是在端到端测试的情况下,您必须处理一个对象

此位开始起作用:

与单元测试相反,在端到端测试场景中,或在应用程序开发时使用模拟替换真实后端api的场景中,通常希望某些类别的请求绕过模拟并发出真实http请求(例如从Web服务器获取模板或静态文件)。要使用此行为配置后端,请使用when的passThrough请求处理程序,而不是respond

翻译:您可以使用
.passThrough()
,您的拦截器应该可以工作:

$httpBackend.whenGET('api/vehicles').passThrough();
缺点是这样做会满足实际请求

您也可以检查这个非常类似的问题:

我能够通过使用超时来解决$httpBackend的respond()方法中可用的函数内部的承诺,从而实现这一点

我在我的angular服务上测试一个方法,该服务使用API调用的结果填充列表。此外,我在该服务上有bools,指示列表何时加载以及何时完成。因此,在我的特定单元测试中,我只想确保“加载”bool设置为true,然后在完成时返回false(并且在成功填充该列表后,“加载完成”bool设置为true)

为此,我需要延迟模拟的httpBackend GET响应,允许我检查“加载”bool是否设置为true,以及“完成加载”bool是否未定义,但在超时之后,两个bool都需要有新的值

更新:很抱歉没有提前更新此内容。我之前在respond()中放置了$timeout,但是因为我没有执行$timeout.flush())$timeout函数中的expect语句没有执行。我不再以这种方式模拟延迟,但我忘了我在这里发布了此消息。感谢@Mark Amery引起我的注意

var fakeList = [{ id: 1, name: "item 1" }, { id: 2, name: "item 2" }];

$http.expectGET('/myapi/myresource').respond(fakeList);

 myAngularService.myMethod();

 expect(myAngularService.listIsLoading).toBeTruthy();
 expect(myAngularService.listFinishedSuccessfully).toBeUndefined();

 $http.flush();

 expect(myAngularService.listIsLoading).toBeFalsy();
 expect(myAngularService.listFinishedSuccessfully).toBeTruthy();
 expect(myAngularService.myList).toEqual(fakeList);

为什么不在$scope.vehicles中将响应设置为$timeout呢?@Fals我用
setTimeout()
尝试了类似的方法,但没有效果,如果你有一些有效的方法,请告诉我。一旦得到响应,在任何处理完成之前,只需执行$timeout(function(){},2000),此操作将等待2秒才能完成continue@SoluableNonagon$timeout(function(){},2000)与C的sleep(2)不同;Javascript很少休眠、阻塞或等待。这看起来不错,但有几件事。首先,令人遗憾的是,它似乎不适用于
ngMockE2E
版本的
$httpBackend
上的
$httpBackend
方法。其次,将
$httpBackend
别名为
$http
很奇怪,因为它们是完全不同的服务。第三,通过在传递给
.response()
的函数之外创建承诺,然后调用flush,然后检查预解析预期,然后明确解析承诺,最后检查解析后预期,您的单元测试不能变得更好(更不脆弱、更快,并且不需要超时)吗?
var fakeList = [{ id: 1, name: "item 1" }, { id: 2, name: "item 2" }];

$http.expectGET('/myapi/myresource').respond(fakeList);

 myAngularService.myMethod();

 expect(myAngularService.listIsLoading).toBeTruthy();
 expect(myAngularService.listFinishedSuccessfully).toBeUndefined();

 $http.flush();

 expect(myAngularService.listIsLoading).toBeFalsy();
 expect(myAngularService.listFinishedSuccessfully).toBeTruthy();
 expect(myAngularService.myList).toEqual(fakeList);