我正在尝试为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);
}
});
});
答案 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);
}
});
});
});
});
});