Often a CFC will throw a specific error to signify a particular event. Sometimes a developer will need to test to verify a specific message is thrown, and other times they will need to test to verify a specific message is not thrown.
So how does one write a test that passes or fails when an specific exception is thrown?
Here is one way it can be done:
MyComponent.cfc
<cfcomponent name="MyComponent"> <cfproperty name="entities" type="array"> <!--- Initialization ---> <cffunction name="init" access="public" returntype="MyComponent" output="No"> <cfset setEntities( ArrayNew( 1 ) )> <cfreturn THIS> </cffunction> <cffunction name="throwError" access="public" returntype="void" output="No"> <cfargument name="doThrow" required="Yes" type="boolean"> <cfif ARGUMENTS.doThrow> <cfthrow message="Testing CFThrow in CFUnit" type="TestThrow"> </cfif> </cffunction> </cfcomponent>And here is the CFUnit test CFC:
TestMyComponent.cfc
<cfcomponent name="TestMyComponent" extends="net.sourceforge.cfunit.framework.TestCase">
<cffunction name="testThrowError" returntype="void" access="public">
<cfset var b = false>
<cftry>
<!--- Generate an error --->
<cfinvoke component="MyComponent" method="throwError">
<cfinvokeargument name="doThrow" value="true">
</cfinvoke>
<!--- Catch error --->
<cfcatch type="TestThrow">
<cfset b = true>
</cfcatch>
</cftry>
<!--- Verify error was thrown --->
<cfset assertTrue("Expected error was not thrown", b)>
</cffunction>
</cfcomponent>
And here is the test runner template:
index.cfm
<cfsilent>
<cfset CFUnitRoot = "net.sourceforge.cfunit" />
<cfset tests = ArrayNew(1)>
<cfset ArrayAppend(tests, "CFUnit.help.throwtest.TestMyComponent")>
<cfset testsuite = CreateObject("component", "#CFUnitRoot#.framework.TestSuite").init( tests )>
</cfsilent>
<cfoutput>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>CFThrow Test Example</title>
</head>
<body>
<h1>Collection Test Example</h1>
<hr>
<h2>CFUnit Test</h2>
<cfinvoke component="#CFUnitRoot#.framework.TestRunner" method="run">
<cfinvokeargument name="test" value="#testsuite#">
<cfinvokeargument name="name" value="">
</cfinvoke>
</body>
</html>
</cfoutput>