2014-11-20 2 views
1

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

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

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

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

+0

Может быть, вы должны показать код, который вызывает ошибку. Я предполагаю, что вы следите за методом ресурсов, который должен устанавливать свойство $ prom ... Когда вы используете spyOn(), исходная функция заменяется на ту, которая выполняет шпионаж ... исходная функция не выполняется , поэтому никакое обещание никогда не возвращается/не устанавливается. Но вы можете сделать 'spyOn (ресурс,« $ save »). And.callThrough()', чтобы получить функциональность шпиона и исходную функцию, которая будет выполнена. –

+0

Ты прав Сунил. SpyOn был spyOn (_cardService, «save»); Когда я добавляю callThrough, он выполняет тест без ошибки обещания. Если вы переместите свой комментарий к ответу, я помечаю его как таковой. Благодаря! – witters

+0

Рад, что это было разрешено, опубликовано, что в качестве ответа :) –

ответ

2

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

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

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

// Newer Jasmine 2.0 syntax: 
spyOn(resource, "$save").and.callThrough(); 
// Older syntax: 
spyOn(resource, "$save").andCallThrough(); 
Смежные вопросы