2015-04-27 3 views
1

Я читал сообщения, связанные с тем, чтобы не повторять вопрос.Почему ответ на единичный тест всегда успешный?

У меня есть следующий код модульного тестирования:

describe('service', function() { 
var questionApiService; 

beforeEach(module('myApp')); 

beforeEach(inject(function (_questionApiService_) { 
    questionApiService = _questionApiService_; 
})); 

// Test service availability 
it('check the existence of get field question service', inject(function(questionApiService) { 
//expect(1).toEqual(100); 

    questionApiService.getField() 
     .then(function(data) { 

      //console.log(data); 
      expect(1).toEqual(100); 
     }); 
})); 

});

Если я запустил код expect(1).toEqual(100); вне службы, результатом будет Ошибка, но если я напишу тот же код expect(1).toEqual(100); внутри службы, результатом будет Успех, что заставляет меня думать, что валидатор не входит в сервис.

Что-то не так?

EDIT 1:

Здравствуйте Аста, я думаю, ур идея очень хорошая и я пытаюсь реализовать. У меня ошибка в моем коде, и я не знаю, как сделать отладку:

defer = $q.defer(); 
spyOn(questionApiService, 'getField').andReturn(defer.promise); 
defer.resolve(data); 
expect(data.nextQ).toEqual(1); 

Мое тестирование модулей всегда терпит неудачу. Если обещание будет успешным, объект «data» должен иметь атрибут nextQ.

EDIT 2:

Привет Аста, ваш код является удивительным. Я пытаюсь выполнить ваш код в моей системе и все еще с ошибкой. Ут терпит неудачу:

Ошибка: Неожиданный запрос: GET http://mi.url.com/api/thefield Нет больше запрос не ожидал

ли и знаю, что не так? Уточните, что код отлично работает в моем приложении, но проблема - проблема.

Вопрос Api код услуги:

angular.module('myApp.services') 
    .factory('questionApiService', function($http, $q) { 
     var myService = { 
      getField: function() { 
       var defer = $q.defer(); 

       $http.get('http://mi.url.com/api/thefield') 
       .success(function(data) { 
        defer.resolve(data); 
       }) 
       .error(function(data) { 
        defer.reject(data); 
       }); 

       return defer.promise; 
      }; 

     return myService; 
    }); 

Ваш тест:

describe('myApp', function() { 

    beforeEach(function() { 
     module('myApp'); 
    }); 

    describe('questionApiService', function() { 
     it('should check the existence of get field question service', inject(function($rootScope, questionApiService) { 
      var response = null; 
      var promise = questionApiService.getField(); 

      promise.then(function(data) { 
       response = data; 
      }); 

      $rootScope.$apply(); 

      var expectedResponse = { "nextQ": 1 }; 
      console.log(response); 
      //expect(JSON.parse(response.nextQ)).toEqual(expectedResponse.nextQ); 
     })); 

    }); 
}); 
+0

Предоставление кода функции 'getField' было бы полезно. – yazaki

+0

Привет, Yazaki, функция getField - это служба, которая возвращает объект json. В моем приложении работает нормально, но я не знаю, что происходит в ut. Спасибо. – Sommer

+0

Для отладки вы можете проверить выходную форму с ошибкой 'ожидать'. Если 'ожидать (данные) .toEqual (1);' fail, то выход Jasmine должен сообщать вам, почему это не удалось, то есть ожидалось, что-то 'равное' что-то '. Если ваши данные имеют свойство nextQ, то это должно быть на выходе – Asta

ответ

0

Я думаю, вам просто нужно, чтобы переместить ваши ожидания вне then и сделать $rootScope.$apply().

it('should check the existence of the get field question service', inject(function($rootScope, questionApiService) { 
    response = null; 
    promise = questionApiService.getField() 
    promise.then(function(data) { 
     response = data; 
     }); 
    $rootScope.$apply(); 

    expectedResponse = { "nextQ": "value" } 
    expect(JSON.parse(response)).toEqual(expectedResponse); 
})); 

Я создал jsFiddle, с которым вы можете играть. Он устанавливает службу, которая возвращает JSON через обещание, которое я использовал для проверки http://jsfiddle.net/neridum/9uumwfzc/

Альтернативно, если вы хотите протестировать эту услугу из другой службы, вы можете издеваться над ней с помощью шпионов. Здесь вы будете издеваться над ответом как обещанием, а затем разрешите его

defer = $q.defer(); 
spyOn(questionApiService, 'getField').andReturn(defer.promise); 
defer.resolve(data); 
expect(data).toEqual('100'); 
+0

Привет, Аста, благодарю вас за ур ответ. Извиняюсь за задержку моего комментария. Просьба проверить мое редактирование 1. – Sommer

+0

Обновлен мой ответ для тестирования этой услуги, и это то, о чем я думаю, что вы на самом деле спрашивали – Asta

+0

Аста, я ценю вашу помощь, могу ли проверить мою правку 2? Спасибо. – Sommer

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