Есть ли модуль для простого макета объектов req/res для модульного тестирования обработчика стиля соединения?

Я пишу приложение в node.js, которое включает в себя некоторые обработчики конечных точек в стиле подключения (функция (req,resp)) и хотел бы написать несколько модульных тестов для них, не требуя полного запуска приложения.

Я знаю, что могу "просто" вставить любой прибор, который я записываю в него вручную, но мне было интересно, есть ли какая-нибудь библиотека, чтобы помочь мне быстрее генерировать эти приборы.

РЕДАКТИРОВАТЬ: чтобы дополнительно объяснить, что я хочу, я хотел бы, чтобы в моем модульном тесте выполнялся только мой обработчик (не мое приложение), и для этого мне потребуются поддельные req и res. Это те два объекта, которые я хотел бы высмеять.

В настоящее время я использую mocha в качестве тестового прогона и основного модуля assert.

3 ответа

Решение

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

Тестовое задание

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);
    });
});

Определение маршрута

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

Я не совсем уверен, что это действительно то, что вы ищете, но это способ проверить ваши маршруты отдельно.

Я знаю, что этот вопрос старый, но отличный способ сделать это сейчас - использовать Supertest https://github.com/visionmedia/supertest

Если вы когда-либо пользовались тестовой клиентской библиотекой Django, она работает примерно так. Он имитирует запуск ваших представлений / маршрутов, так что вы получите тестовый сценарий, более похожий на то, что ваш браузер отображал ваш браузер. Это означает, что req и res вычеркнуты, но ведут себя ожидаемым образом. Это намного быстрее, чем Selenium (или, например, транспортир, который использует Webdriver под крышками).

Как вы, наверное, знаете, это хорошая идея, чтобы убрать как можно больше своей логики с маршрутов, чтобы она могла быть протестирована отдельно. На самом деле я не рассматриваю использование Supertest в качестве модульного тестирования, поскольку вы неизменно тестируете более одной единицы кода.

Возможно, вас заинтересует небольшой пакет, который я собрал, который немного облегчает создание ложных запросов / ответов с помощью Sinon.

По сути, он просто создает объект, который имитирует стандарт req/res from express и заменяет метод spys, которые вы можете проверить.

Из README:

Ваш тест:

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 })
  })
})

Содержание src/foo.js:

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

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

Другие вопросы по тегам