可以在控制器的show()方法中使用模拟域“实例”吗?

时间:2011-01-14 11:28:19

标签: unit-testing grails mocking

我正在尝试将名为 event 的模拟域实例传递给控制器​​的 show()方法,但是 show()找不到有问题的事件因此返回null。

请注意,以下代码段仍在进行中。

def "trying to show an event containing malicous code"() {
    given: "An event named with malicous code"
    mockDomain(Event)
    def event   = Mock(Event)
    event.title >> "<script type=\"text/javascript\">alert(\"XSS\");</script>"
    event.id    >> 1
    // Do I have to actually create a full-blown event considering all
    // constraints here?

    when: "I try to show that event"
    controller.params.id    = 1
    def result = controller.show()

    then: "The resulting title will be encoded HTML"
    result.eventInstance.title    == event.title.encodeAsHTML()
}

这是控制器的show()方法的开头:

def show = {
    def eventInstance = Event.get(params.id)

    // The event exists
    if (eventInstance) {
            // some processing here

            return [eventInstance: eventInstance, isSubscribed: sub ? true:false, sidebar: 'sidebar']
    }
  1. 是否有一个简单的解决方案,还是我必须真正创建一个完整的事件来处理所有限制?
  2. 如果我必须创建一个完整的事件,我将在哪里放置相应的方法? (我们目前在BootStrap.groovy中使用 createEvent()方法进行初始设置,因此在此处重复此功能不会是DRY。)

1 个答案:

答案 0 :(得分:1)

尝试以下列方式模拟Event对象:

def event   = new Event()
event.title = "<script type=\"text/javascript\">alert(\"XSS\");</script>"
event.id    = 1 // optional 
mockDomain Event, [event]

除非您在event电话中添加mockDomain的实例,否则您将无法使用get

来检索它