我有grails 2.4.4和Cobertura作为秘密测试。我有以下代码要测试:
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?
答案 0 :(得分:1)
根据设计,单元测试不会连接到数据库,而是模拟内存中域的存储。 (另一方面,集成测试确实可以连接到真实的数据库。)
对于每个单元测试,您必须“手动”保存测试所需的实例。为避免重复,您可以使用setup
方法并将该实例保存在类中的所有测试中。
最后,您可以按照Mike W的建议模拟SpringSecurityService
。
@TestMixin(GrailsUnitTestMixin)
@TestFor( UserController )
@Mock([UserController, User])
class UserControllerSpec extends Specification {
def setup() {
new User(username:'test', email:'demo@test.com').save(flush:true)
assert User.count() == 1
controller.springSecurityService = [authentication:[principal: 'demo@test.com']]
}
void "Test the viewMailTemplates action returns the correct model"() {
when: "The viewMailTemplates action is executed"
controller.viewMailTemplates()
then: "The model is correct"
status == 405
}
}
答案 1 :(得分:0)
您可以仅使springSecurityService成为类似以下地图的地图:
void "Test the viewMailTemplates action returns the correct model"() {
given:
controller.springSecurityService = [authentication:[principal: 'email_address_of_user_in_db']]
when:
controller.viewMailTemplates()
then: "The model is correct"
status == 405
}