javascript 自动添加代码到jasmine describe函数中的beforeEach和afterEach

sg2wtvxw  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(91)

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

f4t66c6m1#

这是我想出的.我相信它的工作原理,但我没有像你一样的设置.我张贴我的解决方案,其中有我需要得到这个运行的修改.我希望它把你的正确轨道.
因此,基本上在fake_server init call中,我会覆盖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();
    });
});
lh80um4z

lh80um4z2#

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

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

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

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

bogh5gae3#

// Adding beforeEach in the jasmine example
describe("Car", function(){
var car;
beforeEach(function() {
    car = function Car(){}
});
it("has a name", function() {
    expect(car.name).toBeDefined();
});

});

相关问题