我正在为没有输入和渲染语句的控制器部分编写集成测试 - 所以我不确定我做错了什么但是这会抛出“无法获取属性'appMessages'在null对象上”错误。我对测试很陌生,所以有时候我会想念看似简单的事情。 :)
测试:
@Test
void "test welcome"() {
def ncpic = new IndexController()
def model = ncpic.welcome()
assertEquals 'welcome', model.appMessages.results
}
控制器部分:
@Transactional(readOnly = true)
def welcome() {
def crit = ApplicationMessage.createCriteria()
def results = crit.listDistinct{
or{
isNull('messageInactivationDate')
gt('messageInactivationDate', (new Date()))
}
lt('messageDate', new Date())
}
render(view:'welcome', model:[appMessages:results])
}
答案 0 :(得分:1)
您的测试有几个问题。一个是你不应该创建自己的控制器实例。你应该让测试框架为你做这件事。其次,你期待你的欢迎行动返回模型,但事实并非如此。它调用render方法。像下面这样的东西应该工作。这恰好是使用Spock Spec,但你可以在JUnit测试中做同样的事情......
import grails.test.mixin.TestFor
import spock.lang.Specification
@TestFor(IndexController)
@Mock(ApplicationMessage)
class IndexControllerSpec extends Specification {
void "test something"() {
when:
controller.welcome()
then:
'welcome' == model.appMessages.results
}
}
我希望有所帮助。
编辑:以下是JUnit示例...
import grails.test.mixin.TestFor
@TestFor(IndexController)
@Mock(ApplicationMessage)
class IndexControllerTests {
@Test
void testSomething() {
controller.welcome()
// this assertion is still suspect, but that isn't
// really what the question is about...
assertEquals 'welcome', model.appMessages.results
}
}
这里的相关位是指test mixin添加到此类的model属性。在给定控制器操作的方式的情况下,您不能引用welcome方法的返回值。该操作写得很好,但测试需要以与其兼容的方式编写,如上所示。
答案 1 :(得分:0)
我通常会测试:
import grails.test.spock.IntegrationSpec
class FirstControllerSpec extends IntegrationSpec {
FirstController controller
def setup() {
controller = new FirstController()
}
def cleanup() {
}
void "test something"() {
when:
controller.welcome()
then:
assert controller.modelAndView.viewName == "/first/welcome"
assert controller.modelAndView.model.size() == 1
assert controller.modelAndView.model.appMessages != null
}
}