2015-09-02 5 views
1

Я написал http-сервис для своего приложения, и я хотел бы проверить его с помощью Jasmine, но, честно говоря, это мой первый опыт написания тестов, и я действительно не знаю, с чего начать, может кто-то указать меня к хорошему направлению?Jasmine testing custom http service

Я прочитал много руководств по основному тестированию Жасмин, и я понял, но моя проблема - это больше «что я должен проверить, какие полезные тесты», и эта служба http является прекрасным примером для меня тренироваться с.

Ниже служба HTTP Я хотел бы проверить:

angular.module('acme.services.http', [ 
    'config' 
]) 

    .factory('http', function ($q, $http, $cacheFactory, API_BASEPATH) { 

     // ********************************************************** 
     // Initialize 
     // ********************************************************** 

     var cache = $cacheFactory('toip'); 

     // ********************************************************** 
     // Public API 
     // ********************************************************** 

     return { 
      get: get, 
      post: post, 
      put: put, 
      update: update, 
      destroy: destroy, 
      flush: flush, 
      resource: resource 
     }; 

     // ********************************************************** 
     // Published methods 
     // ********************************************************** 

     /** 
     * Execute a GET http request. 
     * @param path 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function get(path, config) { 
      return call('GET', path, null, config).then(extract); 
     } 

     /** 
     * Execute a POST http request. 
     * @param path 
     * @param data 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function post(path, data, config) { 
      return call('POST', path, data, config).then(extract); 
     } 

     /** 
     * Execute a PUT http request. 
     * @param path 
     * @param data 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function put(path, data, config) { 
      return call('PUT', path, data, config).then(extract); 
     } 

     /** 
     * Execute an UPDATE http request. 
     * @param path 
     * @param data 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function update(path, data, config) { 
      return call('PUT', path, data, config).then(extract); 
     } 

     /** 
     * Execute a DESTROY http request 
     * @param path 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function destroy(path, config) { 
      return call('DELETE', path, null, config).then(extract); 
     } 

     /** 
     * 
     * @param path 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function resource(path, config) { 
      var ext = config.hasOwnProperty('ext') ? '.' + config.ext : ''; 
      return $http.get(toUrl(path) + ext, config).then(function (result) { 
       return result.data; 
      }); 
     } 

     /** 
     * Flush the HTTP cache. 
     * @param {array} keys 
     * @returns {*} 
     */ 
     function flush() { 
      var keys = angular.isArray(arguments[0]) ? arguments[0] : arguments; 

      if (!keys.length) { 
       return cache.removeAll(); 
      } 
      angular.forEach(keys, function (path) { 
       cache.remove(toUrl(path)); 
      }); 
     } 

     // ********************************************************** 
     // Internal methods 
     // ********************************************************** 

     /** 
     * Execute an HTTP request and parse the result. 
     * @param method 
     * @param path 
     * @param data 
     * @param config 
     * @returns {qFactory.Deferred.promise|*} 
     */ 
     function call(method, path, data, config) { 
      config = config || {}; 

      var defer = $q.defer(); 
      var url = toUrl(path); 
      var handleData = (-1 !== ['PUT', 'POST'].indexOf(method)); 
      var dontCache; 

      // don't cache if {cache: false} or if method != GET 
      if (('undefined' !== typeof config && config.hasOwnProperty('cache') && false === config['cache']) || 
       (-1 == ['GET'].indexOf(method))) { 
       dontCache = true; 
      } 

      // try to get data from cache 
      var result = cache.get(url); 

      if (!result || dontCache) { 
       // add method & url 
       config = angular.extend({ 
        method: method, 
        url: url 
       }, config); 

       // force false here as we'll cache later 
       config.cache = false; 

       if (handleData && 'undefined' !== typeof data) { 
        config.data = data; 
       } 

       $http(config) 
        .success(function (result) { 
         if (!dontCache) { 
          cache.put(url, result); 
         } 
         defer.resolve(result); 
        }) 
        .error(function (result) { 
         defer.reject(result['errors']); 
        }); 

      } else { 
       defer.resolve(result); 
      } 

      // if method invoked were PUT/POST or DELETE, remove all cache 
      if (-1 !== ['PUT', 'POST', 'DELETE'].indexOf(method)) { 
       flush(); 
      } 

      return defer.promise; 
     } 

     /** 
     * Convert a dot notation path to an url. 
     * @param path 
     * @returns {string} 
     */ 
     function toUrl(path) { 
      if ('local:' === path.substring(0, 6)) { 
       path = path.substring(6); 
       return path.split('.').join('/'); 
      } 

      return API_BASEPATH + '/' + path.split('.').join('/'); 
     } 

     /** 
     * Extract the HTTP request response. 
     * @param response 
     * @returns {*} 
     */ 
     function extract(response) { 
      if (false === response.success) { 
       return $q.reject(response['errors'][0]); 
      } 
      return response['payload']; 
     } 
    }); 

ответ

0

Я бы проверить $httpBackend ANGULAR в:

Поддельной реализацию серверной HTTP подходят для применения модульного тестирования, которые используют службу HTTP $ ,

0

Тесты письменного блока - это проверка того, что каждая единица (в данном случае функция) выполняет именно то, что она предназначена. Но я уверен, что вы найдете много ресурсов в Интернете, объясняя идею модульного тестирования. Но для начала я могу поделиться некоторыми мыслями, которые есть у меня, когда я пишу тесты.

Принимая вашу функцию toURL в качестве примера, вы должны спросить себя: «Что эта функция должна делать, если path является [...]»

Это должно включать в себя случаи, демонстрирующие, как функция предназначена для работы , но также и те, которые имеют потенциал для ее разрушения. (Я чувствую, что это действительно помогает стать лучшим программистом в целом, если вы всегда думаете о способах разбить свой код)

Например: что произойдет, если вы вызовете функцию с помощью null?

Что произойдет, если вы вызываете его с пустой строкой, числом или с «local:»?

Вам не нужно писать 100 тестов для функции для каждого возможного значения пути, о котором вы можете думать. Вы должны попытаться выяснить, какие случаи являются реалистичными сценариями (если другие люди, чем вы используете свою функцию, очень неясные вещи становятся реалистичными;))

Попробуйте написать тесты, не глядя на вашу функцию, просто подумайте о сценариях и что вы хотите.

Для тестирования функций, которые делают HTTP вызовы, которые вы должны будете издеваться ваши звонки (при условии, что вы не хотите, чтобы сделать фактический вызов к серверу каждый раз вы запускаете тесты)

Я надеюсь, что вы можете получить некоторую пользу из этого.

Получите удовольствие от тестирования :)