在我的情况下如何模拟http请求

时间:2015-09-16 18:54:09

标签: angularjs unit-testing jasmine

我的单元测试有一个奇怪的问题。 在控制器中我有类似

的东西
testFactory.testFunction($scope.id)
       .then(function(returnData) {
           // do something with the return
       })

工厂档案

test.testFunction = function(id) {
        return $http.get('/api/v.10/book/' + id + '/books');
};

单元测试

var books = {data: {id: 333, name: 'my book'}};

beforeEach(inject(function (_$controller_, _$httpBackend_, _$rootScope_, _testFactory_) {
        scope        = _$rootScope_.$new();
        $httpBackend = _$httpBackend_;
        testFactory = _testFactory_;

        testCtrl = _$controller_('testCtrl', {
            $scope: scope
        });

        $httpBackend.whenGET('/api/v.10/book/333/books').respond(books);
    }));


 it('should check if test runs', function() {
         testFactory.testFunction(333).then(function(returnData){
                console.log(returnData)
         })
         $httpBackend.flush();
  })

出于某种原因,'returnData'的console.log将'books'变量添加到对象中,并将标题,状态等添加到响应中。

例如:

Object{data: Object{data: Object{id: ..., name: ...}}, 
             status: 200, headers: function (name) { ... }, 
             transformResponse: [...], 
             url: '/api/v.10/book/333/books', statusText: ''}

我只是期待

{data: {id: 333, name: 'my book''}}作为我的回复。

有人可以帮我解决这个问题吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

respond与单个参数一起使用时,它应该是您希望返回到您的网络服务的数据对象as shown under when in the docs。因此,您需要将books变量更改为{id: 333, name: 'my book'}