2012-12-28 18 views
6

Piszę aplikację w węźle node.js, która zawiera niektóre funkcje obsługi punktów końcowych w stylu łączenia (funkcja (req, resp)) i chce napisać przeciwko nim testy jednostkowe bez konieczności uruchamiania pełnej aplikacji.Czy istnieje moduł do łatwego symulowania obiektów req/res do testowania jednostki obsługi stylu łączenia?

Wiem, że potrafię "po prostu" naciskać, niezależnie od tego, które urządzenie ręcznie do niego piszę, ale zastanawiałem się, czy istnieje jakaś biblioteka, która pomoże mi szybciej generować te urządzenia.

EDYCJA: aby dokładniej wyjaśnić, czego chcę, chciałbym, aby w moim teście jednostki wykonywał tylko mój przewodnik (nie moja aplikacja) i do tego potrzebowałbym fałszywego polecenia i res. To są 2 obiekty, które chciałbym wyśmiewać.

Obecnie używam mokki jako biegacza testowego i modułu podstawowego asemblera.

Odpowiedz

2

Jeśli zdefiniowałeś trasy w taki sposób, że przekazałeś app do funkcji, możesz użyć supertest do przetestowania trasy.

test

var app = require('./real-or-fixture-app'); //depends on your setup 

require('routeToTest')(app); 

var request = require("supertest"); 

describe("Test", function(){ 
    it("should test a route", function(done){ 
     request(app) 
      .post("/route") 
      .send({data:1}) 
      .expect(200, done); 
    }); 
}); 

definicja Route

module.exports = function(app){ 
    app.get("/route", .... 
}; 

Nie jestem całkiem pewien, że to jest naprawdę to, czego szukasz, ale jest to sposób, aby przetestować swoje trasy osobno .

+0

Funkcja ta jest przydatna, aczkolwiek nie jest to dokładnie to, co szukam . Zmienię to pytanie, by lepiej wyjaśnić, czego szukam. Dzięki za odpowiedź :) W międzyczasie poszedłem z czymś bardzo podobnym. Mogę zmienić to, co zrobiłem, by użyć supertestu, ponieważ wygląda czysto. –

2

Wiem, że to pytanie jest stary, ale to świetny sposób, aby to zrobić teraz jest z Supertest https://github.com/visionmedia/supertest

Jeśli kiedykolwiek użyto biblioteki Test Client Django, to działa tak dużo. Symuluje wyświetlanie twoich widoków/tras, dzięki czemu otrzymasz scenariusz testowy bardziej przypominający rzeczywistą przeglądarkę uderzającą w twój widok. Oznacza to, że req i res są wyśmiewane, ale zachowują się w oczekiwany sposób. Jest o wiele szybszy od Selenium (lub, na przykład, kątomierz, który używa Webdrivera pod kołdrą).

Jak zapewne wiesz, dobrym pomysłem jest przeniesienie logiki z tras tak, aby można było testować ją osobno. Naprawdę nie uważam używania Supertestu za testowanie jednostkowe, ponieważ zawsze testujesz więcej niż jedną jednostkę kodu.

+0

Tak. Już miałem "logikę biznesową" w swoim własnym module, ale szukałem sposobu na przetestowanie działania punktów końcowych. W końcu zdałem sobie sprawę, że to, czego tak naprawdę szukałem, to więcej integracji niż jednostki, więc Superttest na poziomie "integracji" i modułu dla modułu działał dobrze :) –

1

Być może zainteresuje Cię niewielka paczka, którą tworzę, co sprawia, że ​​tworzenie fałszywych żądań/odpowiedzi jest nieco łatwiejsze przy użyciu Sinona.

W istocie tworzy obiekt, który naśladuje standard req/res z wyrażenia i zastępuje metodę spy, którą można sprawdzić.

Od README:

test:

import route from '../src/foo' 
import { mockReq, mockRes } from 'sinon-express-mock' 

describe('my route',() => { 
    it('should foo the bar',() => { 

    const body = { 
     body: { 
     foo: 'bar', 
     }, 
    } 
    const req = mockReq(body) 
    const res = mockRes() 

    route(req, res) 

    expect(res.json).to.be.calledWith({ foo: body.foo.bar }) 
    }) 
}) 

Zawartość src/foo.js:

export default (req, res) => { 
    res.json({ foo: req.body.bar }) 
} 

https://github.com/danawoodman/sinon-express-mock

Powiązane problemy