Sinon FakeServer没有在Mocha工作

时间:2014-02-28 22:42:17

标签: javascript ajax mocha sinon

我正在尝试为API调用设置测试。我正在使用before方法创建虚假服务器,并测试我使用$.ajax与我的实际api调用的基本实现。但是,我在server.requests中没有看到任何请求。我的ajax调用使用cannot call method open of undefined触发错误方法。我正在导入Sinon,sinonFakeHttps和sinonFakeServer。我错过了什么在没有运气的论坛上花了2天

这是我的代码。

    describe('Warehouse Row', function (){
        before(function(){
            server = sinon.fakeServer.create();
            server.autoRespond = true;

        });
        after(function(){
            server.restore();
        });

        beforeEach(function(){
            sut = new Sut();
            sut.start();

        });
        it('should exist', function(){
            should.exist(sut);
        });

        it('setting value to positive int should validate',function(done){

            server.respondWith(200, { 'Content-Type': 'application/json' },'{ "stuff": "is", "awesome": "in here" }');


            var callback = sinon.spy();

            $.ajax({
                url: '/something',
                success: function(){
                    callback();
                    callback.should.have.been.called;
                    done();
                },
                error : function(err){
                    console.log(err);
                }
            });
      });

2 个答案:

答案 0 :(得分:2)

我至少看到你的代码存在一个问题,那就是你没有用数组调用server.respondWith。尝试使用以下内容替换该行:

server.respondWith([200, { 'Content-Type': 'application/json' },'{ "stuff": "is", "awesome": "in here" }']);

我创建了一个似乎有效的fiddle

答案 1 :(得分:1)

我有同样的问题。我正在设置Sinon假服务器(使用Mocha和Chai,测试Backbone应用程序),但是我收到了错误:

statusText: "TypeError: Cannot call method 'open' of undefined"

问题是我使用的是Bower Sinon发行版,由于某些原因似乎无法正常工作(对于一个,fakeServer必须单独使用,并且不会自动加载自己的依赖项。) / p>

我切换到CDN版本,这个版本似乎更完整(http://cdnjs.cloudflare.com/ajax/libs/sinon.js/1.7.3/sinon-min.js)并修复了这些问题。

供参考,测试代码:

require([
    '../js/vendor/bower/chai/chai',
    '../js/vendor/bower/mocha/mocha',

    // Originally was:
    // '../js/vendor/bower/sinon/lib/sinon',
    // '../js/vendor/bower/sinon/lib/sinon/util/fake_xml_http_request',
    // '../js/vendor/bower/sinon/lib/sinon/util/fake_server',

    // Changed to:
    'http://cdnjs.cloudflare.com/ajax/libs/sinon.js/1.7.3/sinon-min.js'
],
function(chai) {
    mocha.setup('bdd');

    var expect = chai.expect;
    mocha.setup({
        ui: 'bdd',
        bail: false
    });

    require(['app'],
    function(App) {
        describe('App.Models.Question', function() {
            var server, question;

            beforeEach(function() {
                question = new App.Models.Question();

                server = sinon.fakeServer.create();
                server.autoRespond = true;
            });

            afterEach(function() {
                server.restore();
            });

            it('can be saved', function(done) {
                server.respondWith([200, { 'Content-Type': 'application/json' },'{"status":"200"}']);

                var cb = function(success) {
                        expect(success).to.be.ok;
                        done();
                    }
                question.save(null, {
                    success: function(model, resp) {
                        cb(true);
                    },
                    error: function(model, resp) {
                        cb(false);
                    }
                });
            });
        });
    });
});