6

我正在 node.js 中编写一个应用程序,其中包括一些连接样式端点处理程序( function(req,resp) ),并且想针对它们编写一些单元测试,而不需要运行完整的应用程序。

我知道我可以“简单地”推送我手动写入的任何夹具,但我想知道是否有任何库可以帮助我更快地生成这些夹具。

编辑:为了进一步解释我想要什么,我想在我的单元测试中只执行我的处理程序(不是我的应用程序),为此,我需要一个假的 req 和 res。这些是我想模拟的 2 个对象。

我目前使用 mocha 作为测试运行器和核心断言模块。

4

3 回答 3

2

如果您以传递app给函数的方式定义路由,那么您可以使用supertest来测试路由。

测试

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", ....
};

我不太确定这是否真的是您正在寻找的,但它是一种单独测试您的路线的方法。

于 2013-01-08T22:13:01.703 回答
2

我知道这个问题已经过时了,但是现在使用 Supertest https://github.com/visionmedia/supertest是一个很好的方法

如果您曾经使用过 Django 测试客户端库,它的工作原理与此非常相似。它模拟运行您的视图/路由,以便您获得一个更像是实际浏览器正在访问您的视图的测试场景。这意味着 req 和 res 被模拟出来但以预期的方式运行。它比 Selenium(或者,例如,在幕后使用 Webdriver 的量角器)快得多。

您可能知道,将尽可能多的逻辑移出路由是一个好主意,以便可以单独进行单元测试。我并不真正考虑将 Supertest 用作单元测试,因为您总是要测试多个代码单元。

于 2014-06-06T20:19:56.413 回答
1

你可能对我放在一起的一个小包感兴趣,它使使用 Sinon 创建模拟请求/响应更容易一些。

本质上,它只是创建一个模仿标准req/ resfrom express 的对象,并用您可以检查的间谍替换该方法。

从自述文件:

你的测试:

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

于 2015-12-12T04:12:13.773 回答