2015-04-30 11 views
5

Dokümanlarda olduğu gibi yinelenen form gönderimini test etmek için Ünite Testimde denedim ve işe yaradı. http://grails.github.io/grails-doc/3.0.x/guide/testing.html#unitTestingControllersGrails Integration Test - Yinelenen Form Gönderme her zaman invalidToken

Ancak Entegrasyon Testimde her zaman başarısız oldu ve invalidToken olarak işaretlendi. Ben tokenHolder'ın bölümünde birim testi gibi yazdım.

Entegrasyon Testinde, geçerli belirteci ForForm ile nasıl kullanacağız?

Benim Entegrasyon Testi:

@TestFor(RegisterTestedController) 
class RegisterTestedControllerIntSpec extends Specification { 
    void "test insert data register"() { 
     given: 
     controller.params.username == 'babaenciel' 
     controller.params.companyName == 'tamago' 

     when: 
     def tokenHolder = SynchronizerTokensHolder.store(session) 
     params[SynchronizerTokensHolder.TOKEN_URI] = '/registerTested/signUp' 
     params[SynchronizerTokensHolder.TOKEN_KEY] = tokenHolder.generateToken(params[SynchronizerTokensHolder.TOKEN_URI]) 

     controller.signUp() 

     then:   
     controller.modelAndView.model.parameter.username == 'babaenciel' 
     controller.modelAndView.model.parameter.companyName == 'tamago' 
    } 
} 

Denetleyici: entegrasyonunda

class RegisterTestedController { 
    def signUp() { 
     log.info("session: " + session.properties) 
     log.info("request: " + request.properties) 
     log.info("params: " + params) 

     def invalidToken = false 

     withForm { 
      invalidToken = false 
     }.invalidToken { 
      invalidToken = true 
     } 

     log.info("invalid token: " + invalidToken) 

     if(invalidToken) { 
      flash.code = 'alert-red' 
      flash.message = message(code: "error.general.multipleSubmission") 
      redirect action:'index' 
      return 
     }   

     render view: 'index', model: [parameter: params] 
    }  
} 

cevap

1

parametreler Eğer (http://grails.github.io/grails-doc/2.5.0/guide/testing.html#integrationTesting bakınız) elle oluşturmak zorunda yeni bir kontrolör örneği için ayarlanmış olması gerekir test eder. Ayrıca oturum, entegrasyon testlerinde varsayılan olarak mevcut değildir. RequestContextHolder aracılığıyla şu şekilde alabilirsiniz: RequestContextHolder.currentRequestAttributes().session.

tam kod aşağıdaki gibi görünmelidir:

Ayrıca
YourController yourController = new YourController() 

def token = SynchronizerTokensHolder.store(RequestContextHolder.currentRequestAttributes().session) 
yourController.params[SynchronizerTokensHolder.TOKEN_URI] = '/yourController/yourAction' 
yourController.params[SynchronizerTokensHolder.TOKEN_KEY] = token.generateToken(yourController.params[SynchronizerTokensHolder.TOKEN_URI]) 

yourController.yourAction() 

not: Grails 3.0'da fonksiyonel testler yerine entegrasyon testlerini kullanılması önerilir. Grails Referans Belgelerinin bölüm Integration Testing bölümündeki "Test Denetleyicileri" konusuna bakın.