2016-03-21 4 views
0

Доброе утро,Тестирование параметров метода на заводе

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

Мой код выглядит следующим образом:

'use strict'; 
 

 
services.factory('toto', ['$resource', function ($resource) { 
 
    return $resource('abc', 
 
     {}, 
 
     { 
 
      method1: { 
 
       method: 'POST', 
 
       url: 'urlXYZ' 
 
      } 
 
     }) 
 
}]);

Я хотел бы проверить значение метода и URL в method1.

Я пробовал много вещей, но никто не в порядке:

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

 
describe('tests', function() { 
 
    var toto; 
 

 
    beforeEach(function() { 
 
     inject(function (_toto_) { 
 
      toto = _toto_; 
 
     }); 
 
    }); 
 

 
    // check to see if it has the expected function 
 
    describe('toto service has the expected properties', function() { 
 

 
     it('should have a method1 function', function() { 
 
      expect(angular.isFunction(toto.method1)).toBe(true); 
 
     }); 
 

 
     it('should have a method1 function with the field method defined', function() { 
 
      expect(toto.method1.url).toBeDefined(); 
 
     }); 
 

 
    }); 
 

 
});

Он только говорит мне, что "Ожидаемые неопределенными быть определены." для второго теста.

Есть ли у вас какие-либо представления о том, как я мог бы сделать все, что захочу?

EDIT: Я не уверен, что был очень понятен ... Что я хочу сделать, это проверить значения параметров url и метода метода1, чтобы узнать, не изменил ли кто-то их по ошибке.

EDIT 2: Вот решение с помощью qwetty.

it('should perform POST request to the expected url', function() { 
 
      $httpBackend 
 
       .expectPOST('the expected url') 
 
       .respond({}); 
 
      toto.paginate(); 
 
      $httpBackend.flush(); 
 

 
     });

ответ

1

В тесте я бы назвал "дополнительный" метод, определенный в вашем $ ресурсов завода.

it('should perform POST request and method should be available', function() { 
    $httpBackend 
      .expectPOST('some expected url') 
      .respond({}); // does not matter what You return here ... 
    toto.method1(); 

}); 
+0

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

+0

В тесте я написал контрольное значение параметра 'url' в методе' method1'. – qwetty

+0

CD .. Если вы измените (в будущем) значение параметра url, тест завершится с ошибкой. То же самое относится к имени метода. Различное имя не будет выполнять запрос, и 'expectPOST' не будет сопоставлен, и он вызовет ошибку. Таким образом, оба url и метода полностью протестированы в одном/малом/читаемом тесте. – qwetty

0

Как вы можете видеть, метод объекта ресурса toto.method1 является функцией, а не объект, как вы определили в $resource().

Я думаю, что вы можете изменить возвращение завода

services.factory('toto', ['$resource', function ($resource) { 
    var action = { 
     method1: { 
      method: 'POST', 
      url: 'urlXYZ' 
     } 
    }; 
    return { 
     resource: $resource('abc',{}, action), 
     action: action 
    }; 
}]); 

Конечно, вы также должны изменить способ использования завода.

Или используйте defineProperty:

services.factory('toto', ['$resource', function ($resource) { 
    var action = { 
     method1: { 
      method: 'POST', 
      url: 'urlXYZ' 
     } 
    }; 
    var resource = $resource('abc',{}, action); 
    Object.defineProperty(resource, 'method1', { 
     value: action.method1 
    }); 
    return resource; 
}]); 

Хотя это кажется слишком много усилий только для целей тестирования. :)

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