AngularJS - 通过 $httpBackend 模拟数据有什么意义?
AngularJS - What's the point of mocking data via $httpBackend?
我刚刚开始通过 Jasmine 在 AngularJS 中编写我的第一个单元测试。
不知何故我还是不明白为什么我应该模拟 $httpBackend。为了弄清楚我仍然不清楚的地方,我将写下一个小例子:
假设我有一个 service (myService) 从 URL:
获取数据
function getData() {
return $http.get("http://example.com/data")
.then(function (response) {
return response.data;
});
}
假设 GET 调用 URL “http://example.com/data” returns 以下数据:
{
firstname: "John",
lastname: "Doe"
}
相应的 test 看起来像这样:
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").respond(模拟数据);。
我认为此类测试的目的是检查 GET 调用返回的数据 [在本例中 myService.getData()] 是否真的符合预期数据而不是一些随机模拟数据。那么模拟数据的实际意义是什么,而不是检查 myService.getData returns 真实数据 {firstname: "John", lastname: "Doe"}?
我很清楚我也可以将模拟数据设置为 {firstname: "John", lastname: "Doe"},但是当来自 URL 的真实数据将是动态的,模拟数据和真实数据将不再相等。
提前致谢!
你必须以某种方式区分:
- 单元测试
- 集成测试
- 端到端测试
您想要的是对 getData() 函数进行单元测试。我假设您不关心在这种情况下数据是否正确。您想要 测试的是正确的 URL 是否被调用 .
So you are making sure this unit of your code is working as expected.
举个例子:
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。您想确保添加任何数字,将它们相加并 return 它们。
你的情况要简单得多,所以你可以测试URL是否正确,就这样。
An End-to-End test would also include a proper backend and checks if
the data is ok.
AngularJS documentation说的很清楚:
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
在此示例中,您要确保调用正确 URL/endpoint。如果你真的得到了正确的令牌,那么集成测试或端到端测试更合适,然后调用真正的后端。
我刚刚开始通过 Jasmine 在 AngularJS 中编写我的第一个单元测试。
不知何故我还是不明白为什么我应该模拟 $httpBackend。为了弄清楚我仍然不清楚的地方,我将写下一个小例子:
假设我有一个 service (myService) 从 URL:
获取数据 function getData() {
return $http.get("http://example.com/data")
.then(function (response) {
return response.data;
});
}
假设 GET 调用 URL “http://example.com/data” returns 以下数据:
{
firstname: "John",
lastname: "Doe"
}
相应的 test 看起来像这样:
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").respond(模拟数据);。
我认为此类测试的目的是检查 GET 调用返回的数据 [在本例中 myService.getData()] 是否真的符合预期数据而不是一些随机模拟数据。那么模拟数据的实际意义是什么,而不是检查 myService.getData returns 真实数据 {firstname: "John", lastname: "Doe"}?
我很清楚我也可以将模拟数据设置为 {firstname: "John", lastname: "Doe"},但是当来自 URL 的真实数据将是动态的,模拟数据和真实数据将不再相等。
提前致谢!
你必须以某种方式区分:
- 单元测试
- 集成测试
- 端到端测试
您想要的是对 getData() 函数进行单元测试。我假设您不关心在这种情况下数据是否正确。您想要 测试的是正确的 URL 是否被调用 .
So you are making sure this unit of your code is working as expected.
举个例子:
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。您想确保添加任何数字,将它们相加并 return 它们。
你的情况要简单得多,所以你可以测试URL是否正确,就这样。
An End-to-End test would also include a proper backend and checks if the data is ok.
AngularJS documentation说的很清楚:
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
在此示例中,您要确保调用正确 URL/endpoint。如果你真的得到了正确的令牌,那么集成测试或端到端测试更合适,然后调用真正的后端。