2014-02-08 2 views
6

기본 카르마/재스민 설정을 사용하여 각도 코드를 테스트하고 있습니다.앵귤러 단위 테스트에서 약속을 해결하는 방법

var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 

describe('main controller', function() { 
    var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 


    beforeEach(inject(function($controller, $rootScope, $q) { 
    scope = $rootScope.$new(); 
    $controllerConstructor = $controller; 
    q = $q; 
    mockSuperheroData = { 
     getSuperheroes: function() { 
     deferred = q.defer(); 
     return deferred.promise; 
     } 
    }; 
    ctr = $controllerConstructor('MainCtrl', {$scope: scope, $location: {}, superheroService: mockSuperheroData, keys: {}}); 
    })); 

    it('should set the result of getResource to scope.heroes', function() { 
    scope.getHeroes(); 
    expect(scope.heroes).toBe(100); 
    }); 
} 

scope.getHeroes()이 약속을 반환하는 mockSuperheroData.getSuperheroes() 전화 : 여기 내 테스트입니다. 어떻게하면 단위 테스트에서 원하는 것을 반환하겠다는 약속을 강요합니까? 어디에서 그 수익을 조롱하겠다는 약속을 할 수 있습니까?

+0

실제로'var' 선언문을 사용할 수 있습니다 ... – Bergi

+0

죄송합니다. 질문에 추가하는 것을 잊어 버렸지 만 지금은 거기에 있습니다. – jhamm

답변

4

단위 테스트에서 내가 원하는 것을 어떻게 되 돌릴 수 있습니까?

기본적으로 당신은 resolve on the Deferred를 호출해야합니다 : 당신은 직접 return deferred.promise 이전 또는 비동기 setTimeout에 그것을 넣을 수 있습니다

deferred.resolve(100); 

. 적용하는 것이 $ q를가 $ rootScope와 통합되어 있기 때문에,뿐만 아니라 당신이 연기 된 개체를 해결해야하지만, 당신은 또한 $의 rootScope를 호출하여 변경 사항을 전파해야하나요. $ 언급해야

2
var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q; 

describe('main controller', function() { 
    var $controllerConstructor, ctr, mockSuperheroData, scope, deferred, q, rootScope; 


    beforeEach(inject(function($controller, $rootScope, $q) { 
    scope = $rootScope.$new(); 
    $controllerConstructor = $controller; 
    q = $q; 
    rootScope = $rootScope; 
    mockSuperheroData = { 
     getSuperheroes: function() { 
     deferred = q.defer(); 
     return deferred.promise; 
     } 
    }; 
    ctr = $controllerConstructor('MainCtrl', {$scope: scope, $location: {}, superheroService: mockSuperheroData, keys: {}}); 
    })); 

    it('should set the result of getResource to scope.heroes', function() { 
    scope.getHeroes(); 

    deferred.resolve(100); 
    rootScope.$apply(); 

    expect(scope.heroes).toBe(100); 
    }); 
}); 

.

나는 projectpoppycock

에서 조롱 각도 약속 블로그를 쓴 나는 plunkr

정말 당신이로 모의 서비스를 주입하는 방법 등으로, 테스트와 함께 동작하는 예제를 썼다 $ controller 서비스를 사용하여 컨트롤러의 종속성을 조정하려면 내 방식을 수정해야 할 수도 있습니다. 너의 길은 더 좋다 :) 고마워!

+0

'. $ apply()'는 매우 중요합니다 --- 감사합니다! +1 –

관련 문제