2015-02-02 12 views
9

Bir REST API'sinin, geçersiz bir JSON sözdizimi, örneğin eksik bir virgül gibi bir gövdeye sahip bir POST isteğini işleme şeklini test etmek istiyorum. API testlerini yazmak için node.js kullanıyorum. frisby kullanıyorum ama aynı zamanda supertest denedim. Şanssız. Önceki araçlarla, istek gövdesini bir JavaScript nesnesi olarak iletirsiniz, o yüzden olmaz. Ayrıca, geçersiz JSON'u herhangi bir şans olmadan bir dizgeden geçirmeyi denedim, çünkü bir dize de geçerli JSON (aşağıdaki örnek). Herhangi bir fikir?API'nin node.js'yi kullanarak geçersiz JSON sözdizimi istek gövdesini nasıl işlediğini sınayın.

frisby.create('Ensure response has right status') 
    .post('http://example.com/api/books', '{"invalid"}', {json: true}) 
    .expectStatus(400) 
    .toss(); 
+0

Kullandığınız dize ve nesnelere örnekler verebilir misiniz? – Demurgos

+0

@Demurgos Bir örnek eklendi, teşekkürler. – alefteris

+1

Bu teste ihtiyacınız varsa, bu hatanın oluşmasını beklediğiniz bir durum olmalıdır. Bu hata oluştuğunda bir senaryo sağlayabilir misiniz? – freele

cevap

4

Supertest ve mocha paketlerini kullanarak, böyle geçersiz JSON yayınlayarak bir bitiş noktası test edebilirsiniz:

var request = require('supertest'); 

describe('Adding new book', function(){ 
    it('with invalid json returns a 400', function(done){ 
    request('http://example.com').post('/api/books') 
     .send('{"invalid"}') 
     .type('json') 
     .expect('Content-Type', /json/) 
     .expect(400) 
     .end(function(err, res) { 
      console.log(res.error); 
      done(); 
     }); 
    }); 
}); 

Burada önemli bit type(json) olduğunu. Bu, isteğin İçerik Türü'nü uygulamaya/json'a ayarlayacaktır. Dışarıda, en yüksek/süperantlayıcı dizeleri uygulama/x-www-form-urlencoded olarak göndermeyi varsayılan olarak kabul edecektir. Ayrıca geçersiz JSON, bir JavaScript nesnesi olarak değil, bir dize olarak sağlanır.

3

Ben Frisby veya superagent kullanılan hiç, ama burada iki soru vardır bulmak:

yakında istemci tarafında kendisine reddedilecektir, çünkü mümkün değildir

1. passing an invalid JSON from client to server using POST method.

ve sunucuya bir POST isteği yapmadan önce hata alır.

2. pass an invalid JSON just as a string

örnek (http ile çalışırken sadece dizeleri olduğu gibi, müşteri kendisi geçersiz JSON ile sıkışmış alacak JSON stringify çalışacağım çünkü): POST

$.post("demo_test_post.asp", 
    { 
     name: 'pqr:{"abc":"abc",}' // see there is a comma at the end making JSON invalid 
    }, 
    function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    }); 
JQuery

kullanarak böyle bir dize

Bu, geçersiz JSON'u (bu durumda adı) sunucuya srting olarak etkin bir şekilde iletecektir. Ancak bu, kullanabilmeniz için dizeyi JSON.parse() kullanarak JSON'a ayrıştırmanızı gerektirecektir. Bunu almak çalıştığımda:

SyntaxError: Unexpected token p at Object.parse (native) at Object.app.get.res.send.data [as handle] (/home/ubuntu/workspace/TapToBook.js:35:19) at next_layer (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:107:5) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:195:24) at Function.proto.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:251:12) at next (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:189:19) at Layer.staticMiddleware [as handle] (/home/ubuntu/workspace/node_modules/express/node_modules/serve-static/index.js:55:61) at trim_prefix (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:226:17) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:198:9)

Yani istirahatiçin kullanmak paketler hangisi

, bir dize olarak geçersiz JSON geçmesi, ancak bunu kullanamaz.

+0

Cevabınız için teşekkür ederiz. Soruyu, söz konusu pakette belirtilen paketlerden biri ile birlikte işlevsel bir test olarak tercih etmeyi tercih ederim. O zamandan beri en azından nasıl en iyi şekilde yapılacağını anladım. – alefteris

+0

@alefteris. Sorun değil dostum –

1

Sınama isteğinizin, sunucunun geçersiz JSON ile çalıştığı (ve kilitlenmediği) doğrulamak üzere olduğunu varsayıyorum. Umarım 400 kötü bir istekte bulunur.

http'deki bir POST yalnızca bir dize olduğundan, sınama için bir seçenek, bir JSON nesnesini tedarik etmenizi gerektiren bir API kullanmaktır. Eğer çiğ düğüm http kullanırsanız

, sonra istediğiniz geçersiz olursa olsun dize gönderebilirsiniz: Ayrıca popüler istek kitaplığı yoktur

How to make an HTTP POST request in node.js?

.

https://github.com/request/request

Örneğin, kütüphane ile, test bir dosya ve yayının veya koymak geçersiz içeriği almak olabilir. Onların Dokümanlar:

fs.createReadStream('file.json').pipe(request.put('http://example.com/obj.json')) 
+0

Cevabınız için teşekkürler. İstek paketini doğrudan testlerde kullanmayı düşünmedim. Cevabın kod örneğinin tam işlevsel bir sınama olması, tercihen geçersiz JSON.I saklamak için bir dış dosya kullanarak dışarıda olmasını tercih edersem tercih ederim. Farklı, bu yüzden ben de bir tane bunu yapabilirdi. – alefteris

İlgili konular