1

JSON マップを返す必要があるコントローラー メソッドがあります。その中の項目の 1 つは、テンプレートからの html です。私は次のようなコードを使用しています

map['html'] = g.applyLayout(name: 'layoutName', g.render(template: 'template', model: [...])
...
render(map as JSON)

そして、このメソッドを呼び出すコントローラー単体テストを取得しました。ただし、テストを実行すると、次の例外が発生します。

java.lang.IllegalStateException: Cannot return Sitemesh factory it has not been set!
at org.springframework.util.Assert.state(Assert.java:384)
at org.codehaus.groovy.grails.web.sitemesh.FactoryHolder.getFactory(FactoryHolder.java:39)
at org.codehaus.groovy.grails.web.sitemesh.FactoryHolder$getFactory.call(Unknown Source)
...

g.applyLayout() を取り出して g.render() を使用すると、テストが実行されます。私は何を間違っていますか?

アップデート

ここに私の単体テストクラスがあります

@TestFor(ContactsController)
@Mock([Contact, User, Company])
class ContactsControllerTests {
    @Test
    void testSaveContact() {
        defineBeans {
            contactsManagerService(ContactsManagerService)
        }

        Company company = new Company(name: 'COMPANY 1')
        company.save(validate: false)
        Contact userContact = new Contact(name: 'user contact', email: 'foo@bar.com')
        Contact companyContact = new Contact(name: 'company contact', email: 'foo2@bar.com')
        userContact.save(validate: false)
        companyContact.save(validate: false)
        new User(name: 'user 1', password: 'foo', contact: userContact, company: company).save(validate: false, deepValidate: false)

        controller.params.name = ''
        controller.params.email = 'updated1@bar.com'
        controller.saveContact(userContact.id)
        assertNotNull(response.json.errors) // Name cannot be empty

        response.reset()
        controller.params.name = 'Updated Name'
        controller.params.email = 'updated1@bar.com'
        controller.saveContact(userContact.id)
        assertTrue(response.json.success)

        Contact contact = Contact.read(userContact.id)
        assertEquals('Updated Name', contact.name)
        assertEquals('foo@bar.com', contact.email)
    }
}
4

1 に答える 1

2

メーリング リストの別のトピックでJeff の応答を見て、単体テストで SiteMesh 依存タグを使用できないと思います。

考えられる解決策は次のとおりです。

  • 生成された JSON が正しいことを主張して、HTML をモックします。
  • 統合では完全な環境にアクセスできるため、統合テストを実行してレイアウトとテンプレートを検証します。
于 2013-08-27T13:34:28.543 に答える