2015-04-17 13 views
7

- BackgroundMocha: Testowanie wyrażeń Express renderowanych

Próbuję przetestować aplikację Express. Jest to dla mnie projekt typu hobby, więc nie używałam Expressu do obsługi aplika- cji JSON (jak to zwykle się dzieje).

- Problem

Problem jest, nie mogę wymyślić sposób, aby przetestować zawartość widoku, aby upewnić się, że strona jest faktycznie wydane przeciwko pliku widoku w samym projekcie.

- Co Próbowałem

Na przykład, nie mogę przetestować prostą stronę indeksu, ponieważ plik jade rozpoczyna extends layout. To sprawia, że ​​testowanie dynamicznej zawartości jest trudne.

Czy ktoś ma sugestie dotyczące sprawdzenia, czy widok jest faktycznie renderowany?

it ('renders the index page', function(done) { 
    var jade = require('jade'); 
    var should = require('should'); 
    var fs = require('fs'); 

    supertest(app) 
    .get('/') 
    .expect(200) 
    .end(function(err, res) { 
     var rawJade = fs.readFileSync('./views/index.jade').toString(); 
     res.text.should.equal(rawJade.convertToHtml()); // jade supports a function like this 
    }); 
)}; 

Odpowiedz

1

Istnieje, jak zwykle, kilka sposobów na zaatakowanie tego problemu. Zanim przejdę dalej, zachęcam cię do zadania sobie pytania, dlaczego musisz to zrobić. Testy takie są wyjątkowo niestabilne. Jeśli zrobisz jakąś drobną zmianę, zmusisz cię do przepisania testów, które teraz zawodzą.

Mimo to, myślę, że najprostszym sposobem, aby rozpocząć dodawanie testów dochodzić właściwy rendering jest z https://github.com/cheeriojs/cheerio

Podstawowym przykładem może wyglądać następująco:

it ('renders the index page', function(done) { 
 
    var should = require('should'); 
 
    var cheerio = require('cheerio'); 
 

 
    supertest(app) 
 
    .get('/') 
 
    .expect(200) 
 
    .end(function(err, res) { 
 
     err.should.not.be.ok(); 
 
     res.should.be.ok(); 
 
    
 
     var $ = cheerio.load(res.body); 
 
     var header = $('h1:first'); 
 
     header.should.equal('Hello World!'); 
 
    
 
     done(); 
 
    }); 
 
)};

teraz nie będziesz testował, czy renderowany widok wygląda dokładnie tak, jak chcesz (to znaczy, że mógłbyś, ale to byłoby nudne). Ale oznacza to również, że jeśli dokonasz drobnej, nieznacznej zmiany, to wszystko się nie rozpadnie. Zamiast tego możesz skupić się na testowaniu poprawności renderowania kluczowych aspektów interfejsu użytkownika (np. Tytuł strony z poprawnymi właściwościami pisowni i klasy/identyfikatora)

Powiązane problemy