Grails 2.4.4 покрытие springSecurityService - PullRequest
0 голосов
/ 17 октября 2018

У меня есть 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)», это приведет к нулю, даже если у меня есть этот пользователь, и программа (в разработке) отлично работает с базой данных в localhost с Mysql

Как я могу пройти этот тест?Как создать новый сервис SpringSecurityService для этого теста?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Модульные тесты, по замыслу, не подключаются к базе данных, вместо этого они макетируют хранилище для доменов в памяти.(С другой стороны, интеграционные тесты подключаются к реальной базе данных.)

Для каждого модульного теста вы должны «вручную» сохранять экземпляры, необходимые для вашего теста.Чтобы избежать повторения, вы можете использовать метод 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
    }
}
0 голосов
/ 17 октября 2018

Вы можете просто сделать 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
}
...