2013-01-31 3 views
3

각도 $ 리소스를 사용하여 REST 요청에 대한 몇 가지 기본 테스트를 수행하려고합니다. 서비스 코드는 정상적으로 작동합니다.

'use strict'; 

angular.module('lelylan.services', ['ngResource']). 
    factory('Device', ['Settings', '$resource', '$http', function(Settings, $resource, $http) { 

    var token = 'df39d56eaa83cf94ef546cebdfb31241327e62f8712ddc4fad0297e8de746f62'; 
    $http.defaults.headers.common["Authorization"] = 'Bearer ' + token; 

    var resource = $resource(
     'http://localhost:port/devices/:id', 
     { port: ':3001', id: '@id' }, 
     { update: { method: 'PUT' } } 
    ); 

    return resource; 
    }]); 

지시어 내에서 Device 리소스를 사용하고 있습니다. 서비스에서 몇 가지 테스트를 시작할 때 문제가 발생했습니다. . 다음은 $ httpBackend를 사용하여 HTTP 요청을 조롱 한 샘플 테스트이며 조롱 된 URL에 요청합니다.

불행히도 요청이 있었지만 아무것도 반환하지 않습니다. 다른 URL에 대한 요청이 있으면 테스트 스위트가 자동으로 오류를 발생시키기 때문에이 에 대해 확신합니다. 저는 많은 시간을 보냈지만 해결책은 없습니다. 여기 테스트 코드.

'use strict'; 

var $httpBackend; 

describe('Services', function() { 

    beforeEach(module('lelylan')); 

    beforeEach(inject(function($injector) { 
    var uri = 'http://localhost:3001/devices/50c61ff1d033a9b610000001'; 
    var device = { name: 'Light', updated_at: '2012-12-20T18:40:19Z' }; 
    $httpBackend = $injector.get('$httpBackend'); 
    $httpBackend.whenGET(uri).respond(device) 
    })); 

    describe('Device#get', function() { 
    it('returns a JSON', inject(function(Device) { 
     device = Device.get({ id: '50c61ff1d033a9b610000001' }); 
     expect(device.name).toEqual('Light'); 
    })); 
    }); 
}); 

장치가로드되지 않았으므로 오류입니다.

Expected undefined to equal 'Light'. 
Error: Expected undefined to equal 'Light'. 

나는 다음과 같은 솔루션을 사용하여도 시도했다, 그러나 기대를 확인하는 기능 으로하지 않습니다.

it('returns a JSON', inject(function(Device) { 
    device = Device.get({ id: '50c61ff1d033a9b610000001' }, function() { 
    expect(device.name).toEqual('Light'); 
    }); 
})); 

이 문제를 해결하기위한 제안이나 링크는 정말 감사하겠습니다. 고마워요.

답변

5

당신은 매우 가까웠습니다. 누락 된 유일한 것은 $httpBackend.flush();입니다.

it('returns a JSON', inject(function(Device) { 
    var device = Device.get({ id: '50c61ff1d033a9b610000001' }); 
    $httpBackend.flush(); 
    expect(device.name).toEqual('Light'); 
})); 

및 plunker에서 라이브 테스트 : http://plnkr.co/edit/Pp0LbLHs0Qxlgqkl948l?p=preview

당신은 또한 docs for the $httpBackend mock을 확인 할 수 있습니다 다음과 같은 작업 테스트를 보인다.

+0

고마워요. 나는 그것으로 몇 가지 시험을하고 있었다. #flush 부분이 완전히 사라졌습니다. 또한 정말 멋진 라이브 예제에 대해 감사드립니다. 그것을 사랑해. –

0

이후 버전의 각도에서는 1.2.0rc1을 사용하고 있는데이 경우 $ apply 내에서 호출하거나 범위에서 $ digest를 호출해야합니다. 다음과 같이하지 않는 한 리소스 호출이 이루어지지 않습니다.

관련 문제