我有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
}
}