在jasmine描述函数中自动向beforeEach和afterEach添加代码

时间:2013-12-12 22:16:57

标签: javascript jasmine

目前我有以下代码将设置一个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
    }
});

2 个答案:

答案 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)

beforeEachafterEach是全局函数,您可以根据需要添加任意数量的钩子。您应该能够从助手模块中简单地调用它们,而不需要做任何特殊的事情:

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

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

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