/ / Використання g.applyLayout у контролерах розбиває модульний тест - модульне тестування, граали

Використання g.applyLayout в контролері порушує тест блоку - тестування одиниць, грааль

У мене є метод контролера, який повинен повернути карту JSON, одним із елементів якої є html із шаблону. Я використовую код типу

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

І я отримав тест модуля Controller, який викликає цей метод. Однак, коли я запускаю тест, я отримую таке виняток:

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)
}
}

Відповіді:

2 для відповіді № 1

Бачачи Відповідь Джеффа в іншій темі списку розсилки я думаю, що ви не можете використовувати теги SiteMesh, залежні від модульних тестів.

Можливі рішення:

  • Знущайтеся над своїм html, стверджуючи, що сформований JSON правильний;
  • Проведіть інтеграційний тест, щоб перевірити ваш макет і шаблон, оскільки в процесі інтеграції ви маєте доступ до повної екології;