[coldbox 3.5.3] Handler Unit test and setNextEvent()

I am trying to write a unit test for a handler that implements setNextEvent().

I’ve created a simple example using the test handler from the docs. I am getting the error “Variable CONTROLLER is undefined.” when it gets to setNextEvent() in doSomething(). What am I forgetting to do?

component name=“simpleHandler” extends=“coldbox.system.eventhandler” autowire=“true”{

function index(event,rc,prc){

rc.welcomeMessage = “Welcome to ColdBox!”;

event.setView(“general/index”);

}

function doSomething(event,rc,prc){

setNextEvent(“general.index”);

}

}

/**

@handler common.handlers.simpleHandler

*/

component extends=“common.coldbox.system.testing.BaseHandlerTest”{

public void function setup() {

super.setup();

MockBox = getMockBox();

variables.Event = variables.mockRequestService.getContext();

variables.rc = Event.getCollection();

variables.prc = Event.getCollection(private=true);

}

public void function testThatDoSomethingRedirectsToIndex(){

var testEvent = handler.doSomething(Event, rc, prc);

assertEquals(“general.index”, testEvent.getValue(“setNextEvent”) );

}

}

I think your: setNextEvent(“general.index”);

Should be: setNextEvent(event=“general.index”);

Dan

After some more trial and error I was able to get this to work:

/**
@handler common.handlers.simpleHandler
*/
component extends=“common.coldbox.system.testing.BaseHandlerTest”{

public void function setup() {
super.setup();

MockBox = getMockBox();

variables.Event = variables.mockRequestService.getContext();
variables.rc = Event.getCollection();
variables.prc = Event.getCollection(private=true);

handler.$property(propertyName = “Controller”, mock = mockController);
mockController.$(method = “setNextEvent”);
}

public void function testThatDoSomethingRedirectsToIndex(){

handler.doSomething(Event, rc, prc);
var testVal = mockController.$callLog().setNextEvent[1][“event”];

assertEquals(“general.index”, testVal);
}
}

Glad you got it working. On a side note, you are unit testing your handler. Most people test their handlers in integration tests. In fact, if you do that it’s quite a bit easier since the handlers are DI’d and get a a controller object that won’t actually redirect.

http://wiki.coldbox.org/wiki/Testing.cfm#The_Integration_Test

Your test wouldn’t require any of that setup, and would just be two lines:

    function testdoSomething(){
    	var event = execute("general.doSomething");
	assertEquals("general.index", event.getValue("setnextevent") );
    }

Thanks!

~Brad

ColdBox Platform Evangelist
Ortus Solutions, Corp

E-mail: brad@coldbox.org
ColdBox Platform: http://www.coldbox.org
Blog: http://www.codersrevolution.com