为什么要在单元测试中模拟HTTP请求?
Why should I mock HTTP requests inside unit tests?
我正在做一个项目,我们已经开始编写Jasmine单元测试。这个应用程序,像任何好的JS应用程序一样,做了很多异步获取数据的工作。我看到angular提供了$httpBackend来模拟HTTP请求。我还读到并听说在控制器中测试AJAX请求是一个坏主意,因此存在$httpBackend的理由。为什么测试AJAX调用不是一个好主意?大型JS应用程序如何绕过这一事实?实际的服务器测试什么时候进行?
断言您不应该测试来自Jasmine的服务器是一种过于简单的概括。您是需要小型测试、大型测试,还是两者的组合,这取决于应用程序。有人可能会说,它不再是一个"单元"测试了——它是一个"集成"测试——但这些术语已经被重载到毫无意义的地步,因为它是一个相当人为的二分法。编写有用且可维护的测试。选择测试的规模是其中很重要的一部分。什么尺寸合适需要你自己的判断。
单元测试的思想是概述应用程序的一小部分应该如何工作。如果它通过了测试,你就知道它是按指定的方式工作的。
如果你想测试一个向你的API发送请求的服务,你可以设置单元测试来检查传出请求的位置/内容/存在性,并验证它是否正确地响应了一个有效的响应。为了使测试尽可能具体,它不应该测试这个小气泡之外的任何内容。
假设我们想测试这个PersonService
angular服务:
app.service('PersonService', function ($q, $timeout, $http) {
this.addPerson = function(data) {
var deferred = $q.defer();
$http.post('api/People', data).then(function(response) {
deferred.resolve(response);
});
return deferred.promise;
};
});
这是一个简单的茉莉测试:
var service, $httpBackend;
beforeEach(module('app'));
beforeEach(inject(function(_PersonService_, _$httpBackend_) {
service = _PersonService_;
$httpBackend = _$httpBackend_;
}));
describe('addPerson', function() {
var person;
beforeEach(function() {
// Make a person to send
person = new Person({ id: "0ff1165f-7f75-45ed-8faa-ee94d874a1cf" });
});
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should send a person object to the API', function() {
// setup
var promise, expected, actual;
expected = /* Whatever is sent back */
$httpBackend.whenPOST('api/People', person)
.respond(expected);
// act
promise = service.addPerson(person);
promise.then(function(response) {
actual = response.data;
});
$httpBackend.flush();
// assert
expect(actual).toEqual(expected);
});
});
所以我们有一个测试来检查这个非常基本的功能(不管API实际做什么)。这允许我们单独测试代码片段——即如果API被破坏了,你的PersonService
测试不会在相关API测试之外被破坏。你想要构建的是集成测试
相关文章:
- Meteor如何接收HTTP请求
- 在我的情况下,如何进行http请求
- 使用插件收听Firefox标签的http请求
- http请求使用html而不是json进行响应
- 在node-js路由中发出http请求
- 是否可以在没有HTTP请求或<输入>
- Acync JS HTTP请求通知请求
- PhantomJs在控制台中发出http请求时不会返回任何状态
- PHP处理来自一个页面的http请求,并将其显示在另一个页面上
- Firefox插件-如何发出http请求
- 验收测试主要针对传出的http请求
- 验证HTTP请求来自NFC标签上的点击
- 如何制作'http请求'在Node js中同步
- 为什么我在Cloud9中的http请求总是返回错误
- AngularJS Typeahead和$http请求限制
- HTTP请求使用cURL,但在浏览器中使用javascript时会得到CORS响应
- 如何使用Chrome扩展API获取网页的所有HTTP请求
- 将http请求中的数据传递给C#控制器
- 在初始化路由之前发送$http请求
- 从客户端捕获 HTTP 请求(包括 ajax)