Grails - 如何对控制器异步承诺进行单元测试?

时间:2015-01-18 12:42:53

标签: unit-testing grails asynchronous

给出了Grails文档(http://grails.org/doc/latest/guide/async.html#asyncRequests)的扩展示例:

import static grails.async.Promises.*

class myController {

    def myServiceWithLongRunningMethod

    def index() {
       tasks otherValue: {
           // do hard work
           myServiceWithLongRunningMethod.doSomething()
         }
    }
}

如何为此创建Spock单元测试?

import static grails.async.Promises.*
import org.grails.async.factory.*
import grails.async.*
import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(MyController)
class MyControllerSpec extends Specification {

    def mockMyServiceWithLongRunningMethod = Mock(MyServiceWithLongRunningMethod)

    def setup() {
        // not sure if I need this next line
        // Grails docs suggests making Promises synchronous for testing
        Promises.promiseFactory = new SynchronousPromiseFactory()
        controller.myServiceWithLongRunningMethod = mockMyServiceWithLongRunningMethod
    }

    def cleanup() {
    }

    void "index calls myServiceWithLongRunningMethod.doSomething()"() {
        when: 'index is called'
        controller.index()

        then: 'myServiceWithLongRunningMethod.doSomething() is called'
        1 * mockMyServiceWithLongRunningMethod.doSomething()
    }
}

我收到以下错误:

Failure:  index calls myServiceWithLongRunningMethod.doSomething()(MyControllerSpec)
|  groovy.lang.MissingPropertyException: No such property: tasks for class: MyLoadingController

我不确定测试应该是什么样子 - 很清楚我需要做些什么来让测试类能够理解Promise提供的任务方法。

0 个答案:

没有答案