目前我有以下代码将设置一个sinon服务器并做一些其他的东西,FakeServer是一个AMD模块,我可以导入我的测试。它有一个create()和destroy()方法:
describe('do something', function() {
var server;
beforeEach(function() {
server = FakeServer.create();
setupRoutes();
});
afterEach( function(){
FakeServer.destroy(server);
});
我真正想要的是自动将此逻辑添加到beforeEach和afterEach函数中(以防止用户忘记添加afterEach语句)。
这样的事情:
describe('do something', function() {
var server = FakeServer.init(this);
如何自动设置beforeEach和afterEach函数来调用fake_server create()和destrow()函数?
fake_server.js
define(function(require) {
require('sinon.server');
"use strict";
function create() {
$.ajaxSetup({
async: false
});
var server = sinon.fakeServer.create();
server.autoRespond = true;
return server;
}
function destroy(server) {
server.restore();
$.ajaxSetup({
async: true
});
}
return {
create : create,
destroy : destroy
}
});
答案 0 :(得分:0)
这是我想出的。我相信它有效,但我没有和你一样的设置。我发布了我的解决方案,该解决方案具有我需要进行的修改才能运行。我希望它能让你走上正轨。
所以基本上在fake_server初始化调用中,我过度使用beforeEach和afterEach的实现来调用你的服务器代码,然后调用原来的函数来调用它们。如果测试文件中有额外的beforeEach或afterEach设置,那将处理。
我无法从init函数返回服务器,因为它直到beforeEach实际调用之前才初始化,但可以更改为。我为FakeServer添加了一个辅助函数来获取服务器。
fake_server.js
var FakeServer = (function () {
//require('sinon.server');
"use strict";
var myServer;
function create() {
$.ajaxSetup({
async: false
});
var server = {}; //sinon.fakeServer.create();
server.autoRespond = true;
return server;
}
function destroy(server) {
//server.restore();
$.ajaxSetup({
async: true
});
}
function init(describeFunc) {
// grab the original beforeEach and afterEach calles
var beforeEach = describeFunc.beforeEach;
var afterEach = describeFunc.afterEach;
// replace beforeEach
describeFunc.beforeEach = function (fn) {
// call the original beforeEach, in the correct context
beforeEach.call(describeFunc, function () {
// create the server
myServer = create();
// call what ever was passed into beforeEach
fn();
});
};
describeFunc.afterEach = function (fn) {
afterEach.call(describeFunc, function () {
destroy(myServer);
fn();
});
};
}
return {
create: create,
destroy: destroy,
init: init,
server: function () { return myServer; }
}
})();
testFile.js
/// <reference path="fakeServer.js" />
describe("testing123", function () {
// added for testing only
var beforeEachCalled, afterEachCalled;
FakeServer.init(this);
beforeEach(function () {
// added for testing only
beforeEachCalled = true;
});
afterEach(function () {
// added for testing only
afterEachCalled = true;
});
it("should work", function () {
// to access the server
var s = FakeServer.server();
});
});
答案 1 :(得分:0)
beforeEach
和afterEach
是全局函数,您可以根据需要添加任意数量的钩子。您应该能够从助手模块中简单地调用它们,而不需要做任何特殊的事情:
var FakeServer = function() {
var server;
beforeEach(function() {
server = create();
});
afterEach(function() {
destroy(server);
});
};
describe('module', function() {
FakeServer();
it('works', function() {});
});