2015-05-20 6 views
0

Я тестирую контроллер, у которого есть метод, который возвращает объект json с моего сервера. Я действительно смущен тем, как оправдывать то, что возвращает мой метод.

Мне нужно сделать некоторую очистку моего объема на основании результатов.

То, что я пытаюсь выполнить, - это поиск по вызову() -> посмотреть, какие данные возвращаются -> и если длина == 0 -> убедитесь, что моя область имеет определенные значения. Как я могу проверить, что мой метод вернулся?

$scope.clearIds = function(){ 
    //clean out data I don't need anymore 
    } 

    $scope.search = function(inputValue, modelname, action, field){ 
    modelname = modelname || 'companies'; 
    action = action || 'search'; 
    field = field || 'title'; 

    return apiResource.query({api_resource:modelname, api_action:action, api_column:field, api_value:inputValue}).$promise.then(function(response){ 
    if(response.data.length === 0){ 
     $scope.clearIds(); 
    } 
    else{ 
     return response.data; 
    } 
    }); 
    } 

    describe('Controller - TypeaheadSearch', function() { 

    // load the controller's module 
    beforeEach(module('app')); 

    var scope; 
    var apiResource; 
    var stateParams; 
    var q; 
    var deferred; 
    var rootScope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope, $q) { 

     apiResource = { 
     query: function() { 
      deferred = $q.defer(); 
      deferred.resolve('bar'); 
      return deferred.promise; 
     } 
     }; 
     scope = $rootScope.$new(); 
     stateParams = {}; 
     q = $q; 
     rootScope = $rootScope; 
     $controller('TypeaheadSearch', { 
     $scope: scope, 
     $stateParams:stateParams, 
     apiResource: apiResource, 
     }); 
    })); 

    it('Should call apiResource:query', function() { 

     spyOn(apiResource, 'query').and.callThrough(); 
     scope.search(); 
     rootScope.$apply(); 
     expect(apiResource.query).toHaveBeenCalled(); 
    }); 
    }); 
+0

Более проще вы можете просто сделать 'apiResource = jasmine.CreateSpyObj ('apiresource', [ 'запрос']); apiResource.query.and.returnValue ($ q.when (expectedQueryValue)); ' – PSL

ответ

0

Создать шпион за $ scope.clearIds(), а затем expect(scope.clearIds).toHaveBeenCalled() и/или проверить, что clearIds() была эффект, который вы хотите.

Затем устраните фальшивое обещание с данными, которые похожи на то, что ожидает ваш код. Сделайте это в своем (it()) тесте, чтобы вы могли видеть, как код реагирует на разные данные (например, возвращает массив с чем-то в нем).

deferred.resolve({data: []}); 
+0

Хорошо, тогда мой следующий вопрос: как не переписывать весь блок beforeEach только для изменения разрешенных данных, которые передаются? Разве я просто вложил его и снова дублировал всю перед блоком? Также я предполагаю, что я читаю - ** Не имеет значения, какие данные возвращают обратно. Мы это уже знаем. Важно то, что делает код с поддельными данными, которые мы отправляем. ** Справа? –

+0

Зачем вам нужно переписать весь блок beforeEach? Просто переместите эту строку «отложено.resolve()» в свой тест. Даже если вам нужно снова запустить весь код в своем тесте, у JS есть такие сумасшедшие вещи, которые называются функциями, которые делают ненужным дублирование кода. – HankScorpio

+0

Неважно, что ваш код делает с поддельными данными, но если ваш код проверяет длину массива на 'response.data', и вместо любого из них вы даете ему строку, то как вы можете ожидать теста быть значимым? Кто сказал вам, что данные не имеют значения? – HankScorpio