AngularJS - 通过$ httpBackend模拟数据有什么意义?

时间:2016-05-02 13:14:53

标签: angularjs unit-testing jasmine httpbackend

我刚刚开始通过Jasmine在AngularJS中编写我的第一个单元测试。

不知怎的,我仍然不明白为什么我应该嘲笑$ httpBackend。为了弄清楚我还不清楚的地方,我会写一个小例子:

想象一下,我有从网址获取数据的服务 (myService)

 function getData() {
    return $http.get("http://example.com/data")
       .then(function (response) {
          return response.data;
        });
 }

我们假设网址“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); < / em>的。

我认为这样一个测试的目的是检查来自GET调用[在这种情况下 myService.getData()]的返回数据是否真的是预期数据而不是一些随机模拟数据。那么模拟数据的实际情况是什么,而不是检查myService.getData是否返回真实数据 {firstname:“John”,lastname:“Doe”}

我很清楚我也可以将模拟的数据设置为 {firstname:“John”,lastname:“Doe”} ,但是当来自URL的真实数据是动态的时,模拟的数据和实际数据不会再相等。

提前谢谢!

1 个答案:

答案 0 :(得分:3)

你必须以某种方式区分:

  • 单元测试
  • 集成测试
  • 端到端测试

你想要的是对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。你想确保添加任何数字,然后添加它们并返回它们。

您的情况要简单得多,因此您可以测试网址是否正确,就是这样。

  

端到端测试还包括适当的后端并检查是否   数据没问题。

AngularJS documentation表明了这一点:

 it('should fetch authentication token', function() {
   $httpBackend.expectGET('/auth.py');
   var controller = createController();
   $httpBackend.flush();
 });

在此示例中,您要确保调用正确的URL /端点。如果你真的得到了正确的令牌,那么集成测试或端到端测试更适合调用真正的后端。