2015-11-20 3 views
1

У меня возникли проблемы с созданием теста жасмина поверх фабрики издевательства.

The (рабочий) Сценарий:

Контроллер:

.controller("remoteCtrl", function(resourceFactory) { 
 
    var vm = this; 
 

 
    vm.animals = resourceFactory.getAll(); 
 
});

завод

 .factory('resourceFactory', function ($resource) { 
 
      var demoResource = $resource('/demo-1.0/webresources/animal/:id', {id: '@id'}, { 
 
       getAll: {method: 'GET', isArray: true}, 
 
       getFirst: {method: 'GET', params: {id: 0}, isArray: false}, 
 
       save: {method: 'POST', params: {id: null}} 
 
      }); 
 

 
      return demoResource; 
 
     });

MockModule для Backendless развития:

angular.module('playAngular.mock', ['ngMockE2E']) 
 

 
     .run(function ($httpBackend, $log) { 
 

 
      var animals = [ 
 
       {name: 'Animal1', age: '100', id: 0}, 
 
       {name: 'Animal2', age: '100', id: 1}, 
 
       {name: 'Animal3', age: '100', id: 2}, 
 
       {name: 'Animal4', age: '100', id: 3} 
 
      ]; 
 

 
      $httpBackend.whenGET('/demo-1.0/webresources/animal').respond(function() { 
 
       return [200, animals]; 
 
      }); 
 
    //....

Это работает отлично все вместе. Но теперь проблема. Я хочу, чтобы проверить мой контроллер с Jasmin:

describe("Test Suite für RemoteController", function() { 
 
    beforeEach(module('ngResource')); 
 
    beforeEach(module('ngMockE2E')); 
 
    beforeEach(module('playAngular.mock')); 
 
    beforeEach(module('playAngular.remote')); 
 
    
 
    var $controller; 
 
    var $scope; 
 
    var $rootScope; 
 

 
    beforeEach(inject(function (_$controller_, _$rootScope_) { 
 
     $controller = _$controller_; 
 
     $rootScope = _$rootScope_; 
 
    })); 
 

 
    var controller; 
 
    beforeEach(function() { 
 
     controller = $controller('remoteCtrl', {$scope: $scope}); 
 

 
    }); 
 

 
    describe("Basic Remote Test", function() { 
 
     it('Test It:', function() { 
 
      expect(controller).toBeDefined(); 
 
      expect(controller.animals).toBe(4); 
 
     }); 
 
    }); 
 
});

тест потерпит неудачу:

Ожидаемое [$ обещание: обещание ({$$ состояние: Object ({состояние : 0})}), $ resolved: false] должно быть 4.

Я понимаю ошибку, у нас есть неразрешенное обещание здесь, но как я могу заставить его работать, чтобы ждать и протестировать ответ в тесте жасмина? Это одна:

 controller.animals.$promise.then(function(result){ 
      expect(result.length).toBe(4); 
     }); 

не будет работать, а также (жасмин не ждать ответа и просто возвращается с «все в порядке»

Стараюсь все подсказки, которые я нашел в Интернете:. Триггер дайджест цикл промывки httpbackend, но ничего не получалось Видит ли кто-нибудь проблему

ответ

0

Все примеры я нашел до сих пор основаны на насмешливый Ressource и не используя ngMockE2E

Somethink так:.?.

beforeEach(function() { 
    var resourceFactoryTest={ 
     getAll: function() {return [{id: 1}];}, 
     getFirst: function(){return [{id: 1}];} 
    }; 
    controller = $controller('remoteCtrl', {$scope: $scope, resourceFactory: resourceFactoryTest}); 
}); 

Это будет работать (разумеется) = у нас нет никакого реального ресурса, обещанного беспокоиться. Но моя цель снова использовать мой модуль разработки без поддержки (на основе ngMockE2E), который производит все мои локальные тестовые данные для теста jasmin вместо создания тестовых данных снова в самих тестах jasmin.

На основании сообщения в блоге: Blog Я предполагаю, что оба модуля ngMock и ngMockE2E «обычно» не будут работать вместе. Решение там основано на небольшом взломе custome, который может работать (я его не тестировал) На данный момент у меня появился центральный «MockDataRessource», который является всего лишь фабрикой для производства моих тестовых данных, которые я теперь использую в функции ngMockE2E и тестирования. Не совершенен, но работает.

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