Grails 2.4.5控制器单元测试验证事务已回滚

时间:2015-09-07 17:39:05

标签: unit-testing grails

这是一个简单的控制器

Producer

这是一个单元测试规范

class UserController {
   @Transactional
   def update() {
      try {
        ....
        throw new Exception("test transaction rollback")
        ...
      } catch( e ) {
        transactionStatus.setRollbackOnly()
        respond "{ "status":"error" }"
      }
   }
}

什么是测试事务已回滚的最佳方法?

在@BurtBeckwith建议之后尝试了集成规范。

// Domain User.groovy

@TestFor(UserController)
class UserControllerSpec extends Specification {
   when:''
   controller.update()

   then:'verify that transaction has been rolled back'
   // it fails with missing property, whats the best way to check that it was rolled back ?
   controller.transactionManager.transactionRolledBack == true
}

// UserController.groovy

class User { String firstName; String lastName }

// IntegrationSpec UserControllerIntegrationSpec.groovy

  class UserController {
    static responseFormats = ['json', 'xml']
    static allowedMethods = [update: 'PUT']
    @Transactional
    def update( UserCommand cmd ) {
       User m = User.get(id)
       m.firstName=cmd.firstName
       m.lastName=cmd.lastName
       m.save(failOnError:true,flush:true)
       transactionStatus.setRollbackOnly()
    }
  }
  class UserCommand { Long id; String firstName; String lastName }

// DataSource.groovy

import grails.test.spock.IntegrationSpec
class UserControllerIntegrationSpec extends IntegrationSpec {
   def controller
   def sessionFactory

   def setup() {
     controller = new UserController()
   }

   void "test transaction rollback"() {
      given:'a user'
      User u = new User(firstName:'oldFirstName',lastName:'oldLastName')
      u.save(flush:true,failOnError:true)

      controller.request.method='PUT'
      controller.request.contentType = "application/json"
      controller.request.content =   '{"id":u.id,"firstName":"newFirstName","lastName":"newLastName"}'.getBytes()

      when:'an update that rollsback is called'
      controller.update()
      // clear so that we do not get data from cache.
      sessionFactory.currentSession.flush()
      sessionFactory.currentSession.clear()

      then:'we should still see old data'
      User u2 = User.get(u.id)
      // The following fails, u.firstName has 'newFirstName' which is wrong on rollback
      u2.firstName == 'oldFirstName'
      u2.lastName == 'oldLastName'

   }
}

即使我们回滚,集成测试数据中的任何想法似乎仍然存在?

0 个答案:

没有答案