使用嵌套的spy测试对Restangular的服务调用

时间:2013-11-04 11:54:50

标签: angularjs jasmine restangular

我正在测试的服务有这个功能(例如):

doSomething : function(userID,boolean){

                var t = otherService.getSomething();
                var params = somedata;
                var deferred = $q.defer();
                if (boolean){
                    Restangular.one("users",userID).post("copy",params).then(function(data){...

我只想和Restangular上的间谍一起查看是否有正确的参数,端点等使用。

所以我做了一个restangular模拟:

mockRestangular = {
                    one:function(){return this}
                    },



                    post:function(){

                    },
                    all:function(){

                    }
                };
                    },

//also tried:
// one: function(){return {post:function(){}};}


                };

但我无法在模拟中的嵌套帖子上设置茉莉花间谍:

spyOn(mockRestangular.one,'post')我得到post() method does not exist

并且函数调用也失败

someService.doSomething(params)

因为它可以找到post方法。

请注意,我需要将post方法嵌套到一个方法中。如果我只是将一个变为一个对象它将失败,缺少one方法。

猜猜我错过了一些显而易见的事情,但我整个上午一直围绕着这个问题并完全失败

修改

andCallThrough()添加到间谍中,所有部分都朝着正确的方向稳定下来。如果有人有一天会来看,我会在答案中更新。

1 个答案:

答案 0 :(得分:2)

解决方案是: 加入第一个间谍:

spyOn(mockRestangular,'one').andCallThrough();

并将对象更改为:

mockRestangular = {
                    one:function(){
                         return this //since this can be chained to another one or post method, this way it always has one...
                    },



                    post:function(){

                    },
                    all:function(){

                    }
                };

编辑:我搬到了Sinon,茉莉花的间谍无论如何都太有限了。

编辑:这是如何在karma / jasmine测试中移动到chai + sinon(不移动到mocha ..):

npm install karma-sinon-chai

添加到karma.conf.js:

将其添加到plugins列表

'karma-sinon-chai'

并在改变框架:

    frameworks: ['jasmine','sinon-chai'],

现在将一个chai-helper.js文件(名称无关紧要)添加到karma.conf文件中的files数组中。

该文件应包括:

var should = chai.should(); //you don't need all three, just the style you prefer.. 
var expect = chai.expect; //notice that using would break existing test and need you to do a little rewrite to fix the matchers. if you don't want to, comment this line out
var assert = chai.assert;