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

Automatically adding code to beforeEach and afterEach in jasmine describe function

本文关键字:beforeEach afterEach 代码 添加 描述 jasmine 函数      更新时间:2023-09-26

目前我有以下代码,它将设置一个sinon服务器并做一些其他事情,FakeServer是一个AMD模块,我可以将其导入到我的测试中。它有一个create()和destroy()方法:

describe('do something', function() {
        var server;
        beforeEach(function() {
            server = FakeServer.create();
            setupRoutes();
        });
        afterEach( function(){
            FakeServer.destroy(server);
        });

我真正想要的是自动将这个逻辑添加到beforeEach和afterEach函数中(以防止用户忘记添加afterEah语句)。

类似这样的东西:

describe('do something', function() {
     var server = FakeServer.init(this);

如何自动设置beforeEach和afterEach函数来调用fake_server create()和destraw()函数?

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
    }
});

以下是我的想法。我相信它有效,但我没有和你一样的设置。我正在发布我的解决方案,其中包含了运行该解决方案所需的修改。我希望它能让你走上正轨。

因此,基本上,在fake_serverinit调用中,我会优先考虑beforeEach和afterEach的实现,以调用服务器代码,然后调用原始函数来调用它们。这将处理测试文件中是否有额外的beforeEach或afterEach设置。

我无法从init函数返回服务器,因为它直到beforeEach被实际调用才初始化,但这可以改为。我向FakeServer添加了一个helper函数来获取服务器。

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();
    });
});

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

var FakeServer = function() {
    var server;
    beforeEach(function() {
        server = create();
    });
    afterEach(function() {
        destroy(server);
    });
};
describe('module', function() {
    FakeServer();
    it('works', function() {});
});