2013-12-19 130 views
1

我有一个服务,包装阿贾克斯调用($ http)并返回一个承诺。在我的控制,我解决与MyService.stuff(…).then(fn(data){ $scope.stuff = data; })茉莉花:承诺测试功能

承诺如何测试的$scope.stuff价值?

// controller 
$scope.stuff = false; 
$scope.getStuff = function(name) 
{ 
    if (!angular.isDefined($scope.users[ name ])) 
     MyService.stuff('get' , username).then(function(data) 
     { // returns the value of resp.data 
      $scope.stuff = $scope.users[ name ] = data; 
     }); 
    else 
     $scope.stuff = $scope.users[ name ]; 
}; 

我已经得到了测试看起来是这样的:

// test 
describe('scope.stuff',function() 
{ 
    it('should initialize as false', function() 
    { // this passes 
     expect(scope.stuff).toBe(false); 
    }); 

    var httpBackend; 
    beforeEach(inject(function($httpBackend){ 
     httpBackend = $httpBackend; 
    })); 
    it('should have 4 elements', function() 
    { // this stalls 
     runs(function() 
     { 
      httpBackend.whenGET().respond(200, 
      { data: [ 
       {name: 'foo'}, {name: 'bar'}, {name: 'baz'},{name: 'qux'} 
      ]}); 
      scope.getStuff('foo'); 
     }); 
     waitsFor(function() 
     { 
      scope.$apply(); 
      return scope.stuff; 
     }); 
     runs(function() 
     { 
      expect(scope.stuff.length).toBe(4); 
     }); 
    }); 
}); 
+1

看起来您的测试需要2个摘要循环。 httpBackend.flush()用于模拟服务器响应和范围。$ apply()用于解决承诺 –

+0

@EitanPeer,这似乎已经修复了拖延!但是* MyService *似乎并没有拦截httpBackend的响应:当我在'expect.stuff'上面记录期望值时,我得到的是整个对象而不是* data *的值。你知道这是为什么吗? – jacob

+0

@EitanPeer,没关系,我是个白痴。我将有效负载作为名为* data *的对象提供给响应对象的* data * obj。谢谢你的帮助!你会发表你的评论作为答案,所以我可以批准它并关闭这个问题吗? – jacob

回答

2

它看起来像你的测试需要2消化周期。 httpBackend.flush用于模拟服务器响应和范围$ apply for resolve the promise