2014-02-04 3 views
6

Я пытаюсь выполнить проверку одного из моих маршрутов, и я получаю печально известную ошибку «Ошибка: неожиданный запрос». Мой маршрут принимает в качестве параметра «рассосется» и выглядит следующим образом:Единичное тестирование AngularJS route с «разрешением»

when('/Users', 
       { 
        templateUrl: 'app/users/user-list.tpl.html', 
        controller: 'UserListCtrl', 
        resolve: { 
         userAccounts: ['UserAccounts', function(UserAccounts) { 
          return UserAccounts.query({ id: 123 }); 
         }] 
        } 
       }) 

где UserAccounts является «ресурс». Я проверяю свой маршрут следующим образом:

beforeEach(inject(function (_$route_, _$location_, _$rootScope_, _$httpBackend_) { 
     $route = _$route_; 
     $location = _$location_; 
     $rootScope = _$rootScope_; 
     $httpBackend = _$httpBackend_; 

     $httpBackend.when('GET', 'api/Accounts/123/UserAccounts').respond([]); 
     $httpBackend.when('GET', 'app/users/user-list.tpl.html').respond({}); 
    })); 

it('/Users should get user-list template and use UserListCtrl', inject(function($controller) { 
      $httpBackend.expectGET('app/users/user-list.tpl.html'); 
      $httpBackend.expectGET('api/Accounts/123/UserAccounts'); 

      expect($route.current).toBeUndefined(); 
      $location.path('/Users'); 
      $rootScope.$digest(); 

      expect($route.current.loadedTemplateUrl).toBe('app/users/user-list.tpl.html'); 
      expect($route.current.controller).toBe('UserListCtrl'); 
    })); 

И тест не пройден с Error: Unexpected request: GET http://myserver/api/Accounts/123/UserAccounts. Это то, что вызывает мое решение. Любые идеи, какой правильный способ - проверить такой маршрут?

ответ

2

Wow! это было глупо. Я имел полный URL, определенный в моем ресурсе

http://myserver/api/Accounts/:accountId/UserAccounts/:userId 

И я настраивал ожидания на моем $httpBackend для проверки относительных путей.

api/Accounts/123/UserAccounts 
3

Две вещи выглядят странно в вашем тестовом коде.

Во-первых, ваш метод beforeEach имеет запросы GET, дублированные с теми, которые вызываются в реальном тесте. Попробуйте удалить их.

Во-вторых, похоже, что вам не хватает вызова $ httpBacken.flush() перед вашими окончательными утверждениями.

Надеюсь, это поможет.

+0

Причина, по которой я разбил запросы Get на два, состоит в том, что я хотел повторно использовать одно и то же возвращаемое значение из других тестов. $ Httpbackend.flush не помог, как я и предполагал. Это помогло бы, если бы я тестировал контроллер, но я тестирую маршруты здесь. Спасибо за предложения. –

3

Вы можете попробовать насмешливые Службы

beforeEach(module(function($provide) { 
    $provide.value('UserAccounts', { 
     query: angular.noop 
    }); 
})); 

Если вы заботитесь ли название методы обслуживания, вы можете создать шпион.

beforeEach(function() { 
    spyOn(UserAccounts, 'query'); 
}); 
+0

Я раньше пытался насмехаться над сервисом, но это тоже не помогло. Я начал получать ошибки «Запросить неудовлетворенность», когда я издевался над сервисом. Я наконец нашел проблему, и это было действительно глупо. –

0

Для модульного тестирования решенных значений маршрута:

вар resolvedUserAccounts = $ injector.invoke ($ route.current $$ route.resolve.userAccounts.);

Смежные вопросы