圣杯 2.4.4 覆盖弹簧安全服务



我有圣杯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("的事情,它的结果为空,即使我有这个用户并且程序(正在开发中(也可以与带有Mysql的本地主机中的数据库一起使用

我怎样才能通过这个测试?如何为此测试创建新的 springSecurityService?

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

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

最后,你可以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
}
}

你可以把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
}

最新更新