Mock / stub Component with MXUnit

I have a ComponentUnderTest.cfc component that looks like:

<cfcomponent output="false"> <cfset externalComponent = Component("Externalcomponent"); <cffunction name="FunctionUnderTest" access="public"...> <cfset externalComponent.ExternalFunction()> </cffunction> </cfcomponent> 

How can I mock / stub externalComponent.externFunction () in the MXUnit testing component:

 <cfcomponent displayname="ComponentTester" extends="mxunit.framework.TestCase> <cffunction name="MockForExternalFunction"> ..... </cffunction> ?????? <cffunction name=TestComponent> <cfset componentUnderTest = CreateObject("ComponentUnderTest")> ????? <cfset componentUnderTest.FunctionUnderTest()> <!--- should call MockForExternalFunction ---> </cffunction> </cfcomponent> 
+4
source share
2 answers

You will need to enter the mocking component in componentUnderTest to replace the existing one.

You can do something like this:

 // I took this lot from the docs Henry pointed you to: I'm not familiar with MXUnit mocking framework, but this sounds right mockedObjectWithMockedMethod = mock(); mockedObjectWithMockedMethod.ExternalFunction().returns(MockForExternalFunction()); function injectVariable(name, value){ variables[name] = value; } componentUnderTest.injectVariable = injectVariable; componentUnderTest.injectVariable("externalComponent", mockedObjectWithMockedMethod); 

The thing with this is that MockForExternalFunction() just provided the return value returned when calling ExternalFunction() , it is not called instead of ExternalFunction (). That should be good, however.

0
source
 <cfcomponent displayname="ComponentTester" extends="mxunit.framework.TestCase> <cffunction name="MockForExternalFunction"> ..... </cffunction> <cffunction name=TestComponent> <cfset componentUnderTest = CreateObject("ComponentUnderTest")> <cfset injectMethod(componentUnderTest, this, "MockForExternalFunction", "FunctionUnderTest") /> <cfset componentUnderTest.FunctionUnderTest()> <!--- should call MockForExternalFunction ---> </cffunction> </cfcomponent> 

Input method

 <cffunction name="injectMethod" output="false" access="public" returntype="void" hint="injects the method from giver into receiver. This is helpful for quick and dirty mocking"> <cfargument name="Receiver" type="any" required="true" hint="the object receiving the method"/> <cfargument name="Giver" type="any" required="true" hint="the object giving the method"/> <cfargument name="FunctionName" type="string" required="true" hint="the function to be injected from the giver into the receiver"/> <cfargument name="FunctionNameInReceiver" type="string" required="false" default="#arguments.functionName#" hint="the function name that you will call. this is useful when you want to inject giver.someFunctionXXX but have it be called as someFunction in your receiver object"> </cffunction> 
0
source

Source: https://habr.com/ru/post/1439407/


All Articles