我有grails 2.4.4和Cobertura作为 secret 测试。我有以下代码要测试:

def viewMailTemplates(){
    User user = User.findByEmail(springSecurityService.authentication.principal)
    def token = user.activationToken
    def urlActivacion = request.getScheme() + '://' + request.getServerName() +":"+ request.getServerPort() + createLink(controller: "user", action: "activation", params: [token: token])

    def srcImage = request.getScheme() + '://' + request.getServerName() +":"+ request.getServerPort()+ "/assets/logoOlu.jpg"
    render(view: 'mailTemplates/_activationES', model: [srcImage: srcImage, urlActivacion: urlActivacion])
}

我有这个测试:
@TestMixin(GrailsUnitTestMixin)
@TestFor( UserController )
@Mock([UserController, User])

class UserControllerSpec extends Specification {

 void "Test the viewMailTemplates action returns the correct model"() {
      when: "The viewMailTemplates action is executed"
        controller.viewMailTemplates()
        then: "The model is correct"
        status == 405
        }

但是问题是测试模式无法访问数据库并通过此测试,因为springSecurityService = null

如果我执行“User.get(1)”之类的操作,则结果为null,即使我有该用户,并且该程序(处于开发中)也可以在带有Mysql的localhost中与数据库正常工作

我如何通过此测试?如何为此测试创建一个新的springSecurityService?

最佳答案

根据设计,单元测试不会连接到数据库,而是模拟内存中域的存储。 (另一方面,集成测试确实可以连接到真实的数据库。)

对于每个单元测试,您必须“手动”保存测试所需的实例。为避免重复,可以使用setup方法并保存该类中所有测试将使用的实例。

最后,您可以按照Mike W的建议模拟SpringSecurityService

@TestMixin(GrailsUnitTestMixin)
@TestFor( UserController )
@Mock([UserController, User])

class UserControllerSpec extends Specification {

    def setup() {
        new User(username:'test', email:'[email protected]').save(flush:true)
        assert User.count() == 1

        controller.springSecurityService = [authentication:[principal: '[email protected]']]
    }

    void "Test the viewMailTemplates action returns the correct model"() {
        when: "The viewMailTemplates action is executed"
            controller.viewMailTemplates()
        then: "The model is correct"
            status == 405
    }
}

10-07 16:53