2013-12-12 55 views
1

目前我有下面的代碼將設置一個sinon服務器並做一些其他的事情,FakeServer是一個AMD模塊,我可以導入到我的測試中。它有一個create()和destroy()方法:在jasmine中自動添加代碼beforeEach和afterEach描述函數

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

這裏是我想出了。我相信它可行,但我沒有和你一樣的設置。我張貼我的解決方案,其中有修改,我需要得到這個運行。我希望它能給你帶來正確的道路。

所以基本上在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(); 
    }); 
}); 
+0

沒關係,我將在給聖誕節後一個鏡頭。 – jax

0

beforeEachafterEach是全球性的功能,你可以添加許多掛鉤,只要你願意。你應該能夠簡單地從你的助手模塊調用它們,沒有做什麼特別的東西:

var FakeServer = function() { 
    var server; 
    beforeEach(function() { 
     server = create(); 
    }); 
    afterEach(function() { 
     destroy(server); 
    }); 
}; 

describe('module', function() { 
    FakeServer(); 

    it('works', function() {}); 
});