Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Groovy & Grails > Помогите пожалуйста с Unit тестом


Автор: Illdisposed 19.4.2012, 20:16
Здравствуйте.
Не понимаю как тестировать объект предметной области связанные отношением:
Допустим у меня есть класс пользователя:
Код

package com.test

class User {

    String userId
    String password

    Date dateCreated
    Profile profile

    String toString() {
        "${userId} (${id})"
    }

    static constraints = {
        userId(size: 3..20, unique: true)
        password(size: 6..16, validator: { passwd, user ->
            passwd != user.userId
        })
        profile(nullable: true)
        shops(nullable: true)
        articles(nullable: true)
    }

    static hasMany = [ articles : Article, following : User ]
    static mapping = {
        profile lazy: false
        articles sort: 'dateCreated'
    }
}

Есть класс статьи:
Код

package com.test

class Article {

    String title
    String introText
    String fullText

    Date dateCreated
    Date lastUpdated

    static constraints = {
        title(size: 3..20)
        introText(nullable:true)
        fullText(nullable:true)
    }
    static mapping = {
        introText type: 'text'
        fullText type: 'text'
    }

    static belongsTo = [ user : User ]
}

А вот юнит тест статьи:
Код

package com.fancylucy



import grails.test.mixin.*
import org.junit.*

@TestFor(Article)
class ArticleUnitTests {

    void testConstraint() {
        def existingArticle = new Article(title: "Die Alone")
        mockForConstraintsTests(Article, [existingArticle])

        def testArticle = new Article()
        assert !testArticle.validate()
        assert "nullable" == testArticle.errors["title"]

        testArticle = new Article(title: "O")
        assert !testArticle.validate()
        assert "size" == testArticle.errors["title"]

        testArticle = new Article(title: "I'am dead again")
        assert testArticle.validate()
    }
}

Понятно что я не понимаю как это делается, только найти пока не выходит. Роюсь в доках, но что-то пока безрезультатно.

Автор: Laen8 23.4.2012, 16:46
Я попробовал воспроизвести ситуацию, вот что получилось:
1) в тесте некорректный пакет (может быть индуцировано в процессе постинга)
2) не хватает класса Profile (аналогично, у себя создал класс com.test.Profile)
кстати, на ссылку profile можно бы навесить hasOne или unique
3) в User есть constraint на shops, а самого поля нет, закомментировал
4) в заголовке теста я написал 
Код

@TestFor(Article)
@Mock([User])

5) 
Код

testArticle = new Article(title: "I'am dead again", user: new User())

Автор: Illdisposed 25.4.2012, 08:13
Laen8, очень благодарен за помощь! Действительно есть у меня там ошибки... простите меня уж за это, честно сказать не думал что-то кто-то попробует это воспроизвести.
Скажите пожалуйста, а аннотации @Mock([User]) обязательно нужно передавать список? Как-то, http://grails.org/doc/2.0.1/api/grails/test/mixin/Mock.html это трудно понять.

Автор: Laen8 25.4.2012, 09:06
В Mock можно передавать как одно значение, так и список. 

Javadoc часто действительно не полный - конкретно этот момент можно косвенно понять из http://grails.org/doc/latest/guide/testing.html, но иногда проще посмотреть в коде https://github.com/grails/grails-core/blob/master/grails-plugin-testing/src/main/groovy/org/codehaus/groovy/grails/compiler/injection/test/MockTransformation.java.

Еще стоит сказать, что на русскоязычных форумах активность довольно низкая; я, например, это сообщение нашел случайно. Получить ответ на вопрос быстрее обычно можно в grails user mailing list

Автор: Illdisposed 25.4.2012, 20:11
Laen8, Спасибо! Я догадался что Вы случайно увидели мой пост. Удивительно, что Вы не прошли мимо. Еще раз большое спасибо за помощь и советы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)