我正在使用 Grails 2.0.3 和 webFlow 2.0.0。
我的控制器中有一个运行良好的 WebFlow 定义,但我仍想添加集成测试以方便将来的维护。
每当控制器尝试向流范围添加一些值时,我的测试中都会出现以下异常:
ERROR org.codehaus.groovy.grails.webflow.engine.builder.ClosureInvokingAction - Exception occured invoking flow action: No such property: poInfo for class: org.springframework.webflow.core.collection.LocalAttributeMap
groovy.lang.MissingPropertyException: No such property: poInfo for class: org.springframework.webflow.core.collection.LocalAttributeMap
at com.psswm.inboundcal.ReceivingEventController$_closure1_closure6_closure12.doCall(ReceivingEventController.groovy:83)
at grails.test.WebFlowTestCase.signalEvent(WebFlowTestCase.groovy:143)
at com.psswm.inboundcal.ReceivingEventCreationFlowTests.testAddPoInfoMissingPiecesPallets(ReceivingEventCreationFlowTests.groovy:32)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.junit.runners.Suite.runChild(Suite.java:128)
at org.junit.runners.Suite.runChild(Suite.java:24)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at _GrailsTest_groovy$_run_closure4.doCall(_GrailsTest_groovy:290)
at _GrailsTest_groovy$_run_closure2.doCall(_GrailsTest_groovy:248)
at _GrailsTest_groovy$_run_closure1_closure21.doCall(_GrailsTest_groovy:195)
at _GrailsTest_groovy$_run_closure1.doCall(_GrailsTest_groovy:184)
at TestApp$_run_closure1.doCall(TestApp.groovy:82)
| Failure: testAddPoInfoMissingPiecesPallets(com.psswm.inboundcal.ReceivingEventCreationFlowTests)
| org.springframework.webflow.execution.ActionExecutionException: Exception thrown executing org.codehaus.groovy.grails.webflow.engine.builder.ClosureInvokingAction@3beff9ad in state 'addPO' of flow 'create' -- action execution attributes were 'map[[empty]]'
at grails.test.WebFlowTestCase.signalEvent(WebFlowTestCase.groovy:143)
at com.psswm.inboundcal.ReceivingEventCreationFlowTests.testAddPoInfoMissingPiecesPallets(ReceivingEventCreationFlowTests.groovy:32)
Caused by: groovy.lang.MissingPropertyException: No such property: poInfo for class: org.springframework.webflow.core.collection.LocalAttributeMap
at com.psswm.inboundcal.ReceivingEventController$_closure1_closure6_closure12.doCall(ReceivingEventController.groovy:83)
... 2 more
这是我要测试的 My WebFlow 代码的一部分:
def createFlow = {
initialize {
action {
if (params.eventId) {
flow.receivingEventId = params.eventId as int
ReceivingEvent existingReceivingEvent = ReceivingEvent.get(flow.receivingEventId)
flow.receivingEvent = new ReceivingEvent(branch:existingReceivingEvent.branch)
}
}
on ("success").to "addPO"
}
addPO {
on("add") {
log.debug("addPO")
// Initialize flow objects
flow.poInfo = new PoInfo(params)
if (flow.receivingEvent == null) {
flow.receivingEvent = new ReceivingEvent()
}
// validate and populate poInfo object
boolean objectIsValid = flow.poInfo.validateAndPopulate()
if(!objectIsValid) {
if(!flow.poInfo.hasErrors()) {
flash.warning = 'poInfo.poNumber.unknown'
}
return error()
}
// add poInfo object to receivingEvent for additional processing/validation
String errorMessage = flow.receivingEvent.addPoInfo(flow.poInfo)
if(null != errorMessage) {
flash.warning = errorMessage
return error()
} else {
flow.poInfo = null
}
}.to("addPO")
...........
这是我的集成测试:
class ReceivingEventCreationFlowTests extends WebFlowTestCase{
ReceivingEventController receivingEventController = new ReceivingEventController()
void testInitializeFlow() {
startFlow()
assertCurrentStateEquals "addPO"
}
void testAddPoInfoMissingPiecesPallets() {
println("Hola mundo")
startFlow()
assertCurrentStateEquals "addPO"
receivingEventController.params.poNumber = '63055024UI1063'
receivingEventController.params.pro = '3'
println "flow scope: " + getFlowScope().getClass()
println ("Hola again")
signalEvent('add')
assertTrue getFlowScope().poInfo.hasErrors()
assertCurrentStateEquals "addPO"
}
@Override
public Object getFlow() {
receivingEventController.createFlow
}
String getFlowId() { "create" }
}
有人对我在这里缺少什么有任何想法吗?或者 webFlow 2.0.0 和 grails 2.0.3 是否存在任何已知的集成测试问题?
我正在遵循书中的指导方针:Grails in Action,第 9.4 章:测试 WebFlows……但我不断收到上述错误。
提前致谢,
豪尔赫·巴斯克斯