AngularJS – 通过$httpBackend模拟数据有什么意义?
我刚开始通过Jasmine在AngularJS中编写我的第一个单元测试.
不知怎的,我仍然不明白为什么我应该嘲笑$httpBackend.为了弄清楚我还不清楚什么,我会写一个小例子: 想象一下,我有一个从URL获取数据的服务(myService): function getData() { return $http.get("http://example.com/data") .then(function (response) { return response.data; }); } 假设对URL“http://example.com/data”的GET调用返回以下数据: { firstname: "John",lastname: "Doe" } 相应的测试看起来像这样: describe("Service: myService",function () { beforeEach(module("myApp")); var myService,$httpBackend; beforeEach(inject(function (_myService_,_$httpBackend_) { myService = _myService_; $httpBackend = _$httpBackend_; })); afterEach(function () { $httpBackend.verifyNoOutstandingExpectation(); $httpBackend.verifyNoOutstandingRequest(); }); it("should get data",function() { var mockData = {datakey: "datavalue"}; $httpBackend.whenGET("http://example.com/data").respond(mockData); var promise = myService.getData(); $httpBackend.flush(); promise.then(function(response){ expect(response).toEqual(mockData) }); }) }); 除非我弄错了,否则测试应该通过,尽管模拟的数据不等于实际数据.无论我如何设置模拟数据,测试总是会通过,因为服务函数将始终被重定向到$httpBackend.whenGET(“http://example.com/data”)中设置的内容.response(mockData);. 我认为这样一个测试的目的是检查来自GET调用[在这种情况下myService.getData()]的返回数据是否真的是预期数据而不是一些随机模拟数据.那么什么是模拟数据的实际点,而不是检查myService.getData是否返回真实数据{firstname:“John”,lastname:“Doe”}? 我很清楚我也可以将模拟数据设置为{firstname:“John”,姓氏:“Doe”},但是当来自URL的真实数据是动态的时,模拟的数据和真实数据不会再次平等. 先感谢您! 解决方法
你必须以某种方式区分:
>单元测试 你想要的是对getData()函数进行单元测试.我假设你不关心这种情况下的数据是否正确.您要测试的是,是否调用了正确的URL.
举个例子: var add = function(endpoint) { var sum = 0; endpoint().then(function(numberArray) { numberArray.forEach(number) { sum = sum + number; } }); return sum; }; 当你在这里模拟httpBackend时,你实际上并不在意你是否得到1,2,3或5,6,7.你想确保你添加任何数字,你添加它们并返回它们. 你的情况要简单得多,所以你可以测试URL是否正确,就是这样.
AngularJS documentation明确表示: it('should fetch authentication token',function() { $httpBackend.expectGET('/auth.py'); var controller = createController(); $httpBackend.flush(); }); 在此示例中,您要确保调用正确的URL /端点.如果你真的得到了正确的令牌,那么集成测试或端到端测试更合适,然后调用真正的后端. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |