我正在开发REST API的前端.我正在使用Protractor进行端到端测试,并且模拟了API,因为我希望能够单独测试前端.
这是我得到的一个简单的测试:
describe('partner',function () { it('should list partners',function () { var page = new PartnerListPage(); var httpBackendMock = function () { angular.module('httpBackendMock',['ngMockE2E']) .run(function ($httpBackend) { $httpBackend.whenGET('/api/partners').respond(200,{ _embedded: { partners: [ { firstName: 'Elnur',lastName: 'Abdurrakhimov' } ] } }); $httpBackend.whenGET(/.*/).passThrough(); }); }; browser.addMockModule('httpBackendMock',httpBackendMock); page.open(); expect(page.isOpen()).toBeTruthy(); expect(page.getPartner(0).firstName).toBe('Elnur'); expect(page.getPartner(0).lastName).toBe('Abdurrakhimov'); }); });
它的作用基本上是创建后端的模拟,以便它返回我想要的东西.
除了一件事,这一切都很好,花花公子.我希望能够在测试结束时调用以下方法:
$httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest();
我想这样做的原因是验证模拟是否获得预期的请求.对于我提供的测试没有多大意义,但是我要说我想验证当我提交某个表单时,正在执行具有特定数据的特定POST请求.我想在后端模拟自身上进行验证,以便我的测试与输出该POST请求的响应结果隔离,因为它将在另一个测试中进行测试.
如何访问我添加到浏览器中的httpBackendMock中使用的同一$httpBackend实例?
据我所知,Protractor和应用程序本身在不同的进程中运行.因此,我无法像在单元测试中那样直接访问$httpBackend.
您的应用程序在一个单独的进程中在浏览器和量角器中执行.所以你是对的,你无法直接访问浏览器上下文.
幸运的是,量角器为execute javascript in the browser提供了一种机制.我猜你可以使用这种机制来访问$httpBackendMock.
browser.executeAsyncScript(function() { var $httpBackend = angular.injector(['httpBackendMock']).get('$httpBackend'); $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); });
注意:代码改编自this answer.
另一种选择可能是公开“检查URL”
$httpBackend.whenGET('/api/check').respond(function() { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); return [200]; });
并在你的测试中使用它:
browser.get('/api/check');