2015-08-13 14 views
10

POST isteğini güvence altına alarak sorunum var.POST isteği başarısız (restured güvence)

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").  
     when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal)); 

Ama ben böyle param() veya parameter() yöntemleri kullanmak çalışıyordu:

Bu kod çalışır

Bu seferki verir:

given().parameter("key", "val").          
     when().post(url + resource).then().assertThat().statusCode(200); 

Expected status code <200> doesn't match actual status code <415>.

Bu:

given().parameter("key", "val").               
      when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 
java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response. Try registering a default parser using: RestAssured.defaultParser(<parser type>);

Ve bu:

RestAssured.defaultParser = Parser.JSON;             
given().parameter("key", "val").              
     when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty

yanlış neyin fikirler tükendi.

Yapmaya çalıştığım şey, tüm testler için tam jöle yazmaktan kaçınmaktır, "" ve {} tümünü atlayabilirsem daha hızlı olacaktır. Yaklaşımım doğru mu? İlk örneğe

cevap

11

inceleyelim:

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").  
     when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal)); 

Burada yapılan budur istek gövdesine (metin gibi) { "key" : "val" } koymak olmasıdır. Bu metin JSON olur. REST Assured'in bakış açısıyla, geçerli bir JSON olmayan { "key" : "val"'u koyabilirsiniz. Sunucu, sunucusu JSON gerektirdiğinden ve anladığından bu yana doğru yanıt verir. JSON'u içerik türü olarak geçirdiğinizden bu yana, gövdenin JSON olması gerektiğini anlar.

Öyleyse şimdi de ikinci örneğe bakalım:

given().parameter("key", "val").          
     when().post(url + resource).then().assertThat().statusCode(200); 

Burada JSON içerik türü eksik çünkü servis 415 döndürür. param veya parameter'u POST ile kullandığınızda, form parametreleri oluşturmanızdır. Form parametreleri de istek gövdesine gönderilir. BUT form parametreleri JSON değildir!

given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200); 

Yani ikinci örnekte aslında iki sorun var: senin gibi form parametresi olarak "anahtar" ve "val" belirtme bu aynı olacaktır Sen JSON göndermiyoruz

  1. sen

Ve çünkü yanlış içerik türüne sahip (2) sunucudan 415 olsun

Üçüncü örneğe üzerinde taşıma:

given().parameter("key", "val").               
      when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 
(muhtemelen) burada olur o içerik olarak "application/json" dahil etmek isteğini bekler çünkü sunucu bir yanıt gövdesi yok ki ne

tipi. Yani iddia edecek bir beden yok (istek yanlış)! Yanıt sadece başlık olarak 415 durumunu (satır) içerir. Son örnek götürür

:

İşte
RestAssured.defaultParser = Parser.JSON;             
given().parameter("key", "val").              
     when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal)); 

Eğer JSON ama (yine) sorun olarak eksik içerik türü tedavi etmek İçiniz rahat talimat sunucu değil yapmasıdır Herhangi bir cevap gövdesini geri döndürün, bu yardımcı olmaz.

Çözüm:

You should desteklenen bir JSON nesnesi-haritalama çerçeve koymak (Jackson, Daha Hızlı Jackson, Basit JSON veya GSON) Sınıfyolu (örneğin jackson-databind için) ve açıklandığı gibi sadece bir harita oluşturmak documentation:

given(). 
     contentType(ContentType.JSON). 
     body(new HashMap<String,Object>() {{ 
      put("key1, "val1"); 
      put("key2, "val2"); 
      put("key3", asList("val3", "val4")); 
      put("nested", new HashMap<String,String>() {{ 
       put("key4", "val4"); 
       put("key5", "val5"); 
      }}); 
     }}). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 
:

Map<String, Object> jsonAsMap = new HashMap<>(); 
map.put("key", "val"); 

given(). 
     contentType(ContentType.JSON). 
     body(jsonAsMap). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 

Java haritalar oluşturulması beri haritalar iç içe varsa ayrıntılı genellikle böyle bir şey yapmak oldukça olduğunu

Yoksa verilerinizin DTO gösterimini oluşturmak ve sadece bir nesne geçmek emin olmasına:

MyDTO myDTO = new MyDTO(...); 
given(). 
     contentType(ContentType.JSON). 
     body(myDTO). 
when(). 
     post(url + resource). 
then(). 
     statusCode(200). 
     body("otherVal", equalTo(otherVal)); 

Sen object-mapping documentation daha okuyabilir.

+0

https://github.com/rest-assured/rest-assured/issues/744 iyi olmalıdır, 2. son yaklaşımda hata vardır. Benim için JSON'u dize olarak mükemmel bir şekilde çalıştı. İç içe geçmiş JSON – vikramvi

1

Ben yanıtı bulmaya ve ben de bunu anladım ..

sizin src/test/çeşitli kaynaklar klasörüne dosya eklemek ve teste için bu kodu ekleyin.

URL file = Resources.getResource("ModyNewFieldsReq.json"); 
String myRequest = Resources.toString(file,Charsets.UTF_8); 

Response fieldResponse = given() 
     .header("Authorization", AuthrztionValue) 
     .header("X-App-Client-Id", XappClintIDvalue) 
     .contentType("application/vnd.api+json") 
     .body(myRequest).with() 

    .when() 
     .post(dataPostUrl)  

    .then() 
     .assertThat() 
     .log().ifError() 
     .statusCode(200) 
     .extract().response(); 

Assert.assertFalse(fieldResponse.asString().contains("isError"));