2014-11-20 28 views
1

我有一个包装RESTful API的资源。我使用的资源,从我的控制器创建新的对象,并将其保存,类似这样的片段从角文档:

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

当写在茉莉花一个单元测试,我得到以下错误时,$保存通话执行:“无法读取属性$ promise'未定义”。

什么是最好的方法来测试我的控制器中包含上述代码的方法?

+0

也许你应该表明触发错误的代码。我的猜测是你正在监视一个应该设置$ promise属性的资源方法......当你使用spyOn()时,原始函数被替换为一个执行间谍活动的函数...原始函数没有执行,所以没有承诺永远返回/设置。但是你可以通过'spyOn(resource,“$ save”)。和.CallThrough()'来获得间谍功能和原始函数的执行。 – 2014-11-21 00:13:33

+0

你是对的Sunil。 spyOn是spyOn(_cardService,'save');当我添加callThrough时,它会执行没有承诺错误的测试。如果您将评论移至答案,我会将其标记为这样。谢谢! – witters 2014-11-21 13:27:13

+0

很高兴它被解决了,发布作为答案:) – 2014-11-21 15:37:33

回答

2

如果使用茉莉花spyOn()功能来验证$resource方法被调用时,它会覆盖原有的$resource方法有一个实现了“间谍”的功能。

如果你的应用程序中的代码依赖于$resource设置$承诺财产,或者它依赖返回的对象/数组从$resource,茉莉花的间谍功能将不会返回任何东西,或在$承诺设定一个值属性。因此,应用程序中完美的代码在测试时会失败。当您使用$httpthen()success()error()函数时会发生类似的情况。

要解决,你可以使茉莉花的功能间谍以及通过做这样的事情调用原始的功能:

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