2013-04-28 5 views
1

Я написал простой JSON api с выражением, и я пытаюсь использовать мокко, чтобы выполнить некоторые тесты черного ящика. В ходе тестирования API требует аутентификации в качестве разных пользователей, поэтому каждый тест для определенной функции выполняется по меньшей мере из двух запросов: операция входа и один или несколько аутентифицированных запросов, которые проверяют фактическую функцию.Взаимодействующее взаимодействие для тестирования Экспресс-приложений

Я не нашёл ни одной библиотеки, которая похожа на django.test.client, чтобы имитировать взаимодействие между HTTP клиентом и сервером. Supertest кажется популярным, но он очень низкоуровневый по сравнению с клиентом тестирования django. Это, как я хотел бы написать простой тест с проверкой подлинности с ним (простите мой CoffeeScript):

it 'should return a 200 OK', (done) -> 
    supertest(server.app) 
    .post('/login') 
    .send("username=xxx&password=pass") 
    .end (err, res) -> 
     res.should.have.status(200) 
     supertest(server.app) 
     .get('/api/users') 
     .set('cookie', res.headers['set-cookie'][0]) 
     .expect(200, done) 

Является ли это действительно чистый способ выполнить взаимодействие? Есть ли какая-нибудь библиотека, которая помогла бы мне с асинхронностью (не похоже, что мне понадобится что-то, кроме простой сериализации тестов в 99% случаев, обратные вызовы просто запутываются) и состояние? Что-то, что бы так:

it 'should rock', (done) -> myCoolLibrary [ 
    -> 
    @post '/login', {username: "xxx", password: "pass"}, (err, res) => 
     res.should.have.status 200 
     @done() 
    , 
    -> 
    @get '/api/users', (err, res) => 
     res.should.have.status 200 
     @done() 
    ] 

Если ничего подобного не существует, то, что я должен написать это сам :-) зависимостью от контекста, потому что я использую слишком много ZappaJS в эти дни, и благодаря жиру стрелке CoffeeScript в , это совсем не плохая идиома.

ответ

0

Как более общее решение для очистки чистых асинхронных кодов, ознакомьтесь с асинхронным способом. https://github.com/caolan/async

async.serial будет делать то, что вам нужно, но я бы рекомендовал async.auto, который позволяет вам четко связывать различные этапы с их зависимостями.

+0

Более ранняя версия пост имел что-то вроде строк «Это очень похоже на async.series, и это не совпадение». Я должен был оставить его там :-) Очевидно, что node.js не пропускает каких-либо строительных блоков, но, исходя из более монолитной структуры, мне очень сложно обнаружить и изучить 10 модулей, чтобы сделать что-то настолько простое. В конце концов я написал очень специфическую реализацию в Zappa, я отправлю ее здесь в какой-то момент. – BruceBerry

+0

Узел экосистемы вроде Perl: есть более чем один способ сделать это. Вы проводите много времени, оценивая возможные варианты модулей. – dankohn

1

Похоже, вы могли бы воспользоваться zombiejs. Он имитирует браузер и сохраняет файлы cookie и данные сеанса между запросами.

Он также предоставляет вам более мощные функции, такие как возможность заполнения форм и отправки их, например.

Типичный тест будет выглядеть примерно так:

var Browser = require('zombie') 
    , browser = new Browser({site:'http://yoursite.com'}); 
describe('page',function(){ 
    before(function(done){ 
     browser.visit('/loginpage',done); 
    }); 
    it('should return a 200 page',function(done){ 
     browser.fill('username','xxx'); 
     browser.fill('password','pass'); 
     //assuming your form points to /login 
     browser.pressButton('button[type="submit"]'),function(){ 
      assert(browser.success); //status code is 2xx 
     }).then(done,done); //call the done handler after promise is fulfilled 
    }); 
    it('should rock',function(done){ 
     browser.visit('/api/users',function(){ 
      assert(browser.success); 
     }).then(done,done); 
    }); 
0

Я закончил тем, что писал себе небольшую библиотеку, которая очень близка к моей «идеальной», например, в вопросе. Он не заслуживает своего собственного пакета на данный момент, так что я просто положить его в суть:

https://gist.github.com/BruceBerry/5485917

Я не мог получить SuperAgent и Supertest выполнять с учетом состояния взаимодействия, так что я просто угробил их в пользу запроса , Основное различие, по-видимому, состоит в том, что вы не можете ожидать цепочки, и вам нужно делать все тесты в обратном вызове, но они выглядят странно, если вы уже используете другую библиотеку тестирования, такую ​​как should.js

 Смежные вопросы

  • Нет связанных вопросов^_^