如何模拟coldbox.system.web.context.RequestContext并初始化它?

时间:2017-11-14 10:14:35

标签: unit-testing coldfusion coldbox

我在我的工作中继承了一些代码。之前的人写了一些看起来像这样的ColdFusion代码:

public struct function GetData(Event,RC,PRC){};

我正在尝试为此功能编写单元测试,但我不知道如何模拟这个“事件”。 这是我的代码:

mockEvent=createMock(className='coldbox.system.web.context.RequestContext');

ColdBox抛出一个异常,我必须在运行该代码时初始化mockEvent。有谁看到我做错了什么?

1 个答案:

答案 0 :(得分:2)

在扩展Coldbox.system.testing.BaseTestCase的测试中,您可以轻松模拟Coldbox RequestContext对象。

您需要在测试中设置以下变量:this.loadColdbox=true然后,在您测试中调用super.beforeAll()方法后,每次调用setup()时,上下文都是重建。

之后,RequestContext可用方法getRequestContext()。这是一个模拟请求getHTTPMethod()函数的示例(我通常使用此方法来模拟配置为响应不同HTTP谓词的API方法):

function newEventArgs( method = "GET" ) {
        //rebuild the context
        setup();
        //mock the context
        var event = getRequestContext();
        prepareMock( event ).$( "getHTTPMethod", arguments.method );
        var rc = event.getCollection();
        var prc = event.getCollection( private=true );
        prc.response = getWirebox().getInstance( "APIResponse" );

        return {
            "event":event,
            "rc":rc,
            "prc":prc
        };
}

然后你可以测试一个像这样的创建方法:

it( "Tests Widgets.create", function(){

        var testWidget = {
            "name"  : "Test Widget"
        };

        var eventArgs = newEventArgs( "POST" );

        structAppend( eventArgs.rc, testWidget, true );

        var event = execute( 
            route="/api/v1/widgets"
            eventArgs=eventArgs
        );

        expect( event.getPrivateValue( "response" ).getStatusCode() ).toBe( 201, "Event response did not return the proper status code." );

});