Как использовать VndErrorJsonRenderer в модульном тесте Grails

Я пишу модульные тесты контроллера, и я хотел бы проверить результат json при сбое создания.

Как я могу зарегистрировать VndErrorJsonRenderer в модульном тесте? Я пробовал просто определить Beans в setup(), но это не работает :(

import com.vividsolutions.jts.geom.Coordinate
import grails.transaction.Transactional
import org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap

import static org.springframework.http.HttpStatus.CREATED
import static org.springframework.http.HttpStatus.NO_CONTENT

@Transactional(readOnly = true)
class UserController {

    static namespace = "v1"

    static allowedMethods = [profile: 'GET', create: "POST", update: "PUT", delete: "DELETE"]
    static responseFormats = ['json', 'vnd.error+json']

    def springSecurityService

    def geometryFactory


    /**
     * Saves a resource
     */
    @Transactional
    def create() {
        User instance = createResource(params)

        instance.validate()
        if (instance.hasErrors()) {
            respond instance.errors, view: 'create' // STATUS CODE 422
            return
        }

        instance.save flush: true

        respond instance, [status: CREATED]
    }

    protected User createResource(GrailsParameterMap params) {
        Double x = params.double("location.x", 0)
        Double y = params.double("location.y", 0)
        User user = new User()
        bindData(user, params, [include: ['username', 'password', 'profile.*']])
        if (x > 0 && y > 0)
            user.location = geometryFactory.createPoint(new Coordinate(x, y))
        else
            user.location = null
        user.roles = []
        user.roles.add(Role.findByAuthority(Role.ROLE_USER))
        return user
    }



}

И мой тест:

@Before
void setup() {
    defineBeans {
        vndJsonErrorRenderer(VndErrorJsonRenderer)
    }
}
void "Test the create action with a non unique username"() {
        User.metaClass.encodePassword = {
            "aaa"
        }
        // Create first user
        assertNotNull getValidUser().save(flush: true)

        when: "The create action is executed with a username already used"
        def user = getValidUser()
        controller.request.addHeader("Accept", "application/vnd.error+json,application/json")
        controller.request.contentType = "application/json"
        controller.request.content = JsonMapperUtil.mapAsJson(user)?.getBytes()
        controller.create()

        then: "The response status is UNPROCESSABLE_ENTITY and the username unique error is returned"
        println response.text
        response.status == UNPROCESSABLE_ENTITY.value
        def json = JSON.parse(response.text)
        assertNull "VND format not returned", json.errors
    }

Я использую Grails 2.3.6 с спокойным контроллером.

Спасибо


person persa    schedule 07.03.2014    source источник
comment
Дублировать >вопрос?   -  person dmahapatro    schedule 07.03.2014
comment
@dmahapatro Похоже, но предложенное решение не работает :( Я использую spock для тестов (расширяет спецификацию), но если я определяю член vndJsonErrorRenderer в тестовом классе, он не создает его экземпляр. Даже если я создаю его вручную, он не работает .Ressources.groovy не загружается в модульных тестах.И поскольку я использую spock, defineBeans не работает.Есть ли фабрика, которая ищет рендереры и регистрирует их при загрузке приложения?   -  person persa    schedule 07.03.2014


Ответы (1)


В случае, если вы показываете, где вы зависите от ответа, было бы лучше протестировать это больше как интеграционный тест, чтобы все компоненты, которые могут взаимодействовать с ответом, были подключены для вас.

В модульном тесте для того, какие компоненты необходимы в тестируемом классе, я считаю, что проще всего напрямую установить их в тестируемом классе.

person Jeff Beck    schedule 07.03.2014
comment
К сожалению, bean-компонент vndJsonErrorRenderer не является членом моего контроллера. Это просто определено в resources.groovy - person persa; 10.03.2014
comment
Обновленный ответ, извините, я думаю, вам нужно провести интеграционный тест. - person Jeff Beck; 10.03.2014
comment
Хорошо, спасибо. Я посмотрю плагин функционального тестирования. С этим должно быть проще протестировать спокойный API. - person persa; 10.03.2014