Модульное тестирование ngResource $save

У меня есть ресурс, который обертывает RESTful API. Я использую этот ресурс из своего контроллера для создания новых объектов и их сохранения, как в этом фрагменте из документации Angular:

var newCard = new CreditCard({number:'0123'});
newCard.name = "Mike Smith";
newCard.$save();

При написании модульного теста в Jasmine я получаю следующую ошибку при выполнении вызова $save: «Не удается прочитать свойство $promise неопределенного».

Каков наилучший подход к тестированию метода в моем контроллере, который содержит приведенный выше код?


person witters    schedule 20.11.2014    source источник
comment
Может быть, вы должны показать код, который вызывает ошибку. Я предполагаю, что вы следите за методом ресурса, который должен устанавливать свойство $promise... Когда вы используете spyOn(), исходная функция заменяется той, которая выполняет шпионаж... исходная функция не выполняется , поэтому обещание никогда не возвращается/не устанавливается. Но вы можете сделать spyOn(resource, "$save").and.callThrough(), чтобы получить шпионские функции и исходную функцию для выполнения.   -  person Sunil D.    schedule 21.11.2014
comment
Ты прав, Сунил. Шпион был spyOn(_cardService, 'сохранить'); Когда я добавляю callThrough, он выполняет тест без ошибки обещания. Если вы переместите свой комментарий в ответ, я отмечу его как таковой. Спасибо!   -  person witters    schedule 21.11.2014
comment
Рад, что это было решено, опубликовал это как ответ :)   -  person Sunil D.    schedule 21.11.2014


Ответы (1)


Если вы используете функцию spyOn() Jasmine для проверки того, что вызывается метод $resource, она перезаписывает исходный метод $resource тем, который реализует функцию «шпионажа».

Если код в вашем приложении зависит от $resource, устанавливающего свойство $promise, или он зависит от возвращенного объекта/массива из $resource, шпионская функция Jasmine ничего не вернет и не установит значение свойства $promise. В результате идеальный код в вашем приложении не будет тестироваться. То же самое происходит, когда вы используете $http с функциями then(), success() или error().

Чтобы обойти это, вы можете заставить Jasmine следить за функцией, а также вызывать исходную функцию, делая что-то вроде этого:

// Newer Jasmine 2.0 syntax:
spyOn(resource, "$save").and.callThrough();
// Older syntax:
spyOn(resource, "$save").andCallThrough();
person Sunil D.    schedule 21.11.2014