node.js - 测试包含异步调用的函数

标签 node.js asynchronous express mocha.js sequelize.js

我正在尝试测试 get 函数:

exports.get = function(req, res) {
  Subscriptions
    .find(req.params.id)
    .success(function(subscription) {
      if (subscription) {
        res.json({message: "Success"}, 200);
      } else {
        res.json({message: "Not found"}, 404);
      }
    })
    .error(function(error) {
        res.json({message: "Internal server error"}, 500);
    });
};

具体来说,我真的不在乎它是否命中数据库,我只想测试成功和错误事件发生的场景。我使用 sequelize.js 作为我的 orm 来处理数据库。我已经启动并运行了一个测试,但它有点讨厌,超时。有没有更好的方法来做到这一点?这是我到目前为止编写的测试:
var express = require('express')
  , sinon = require('sinon')
  , subscription = require('app/controllers/subscriptions')
  , Subscriptions = require('app/models/subscriptions')
  ;

describe('subscription controller', function() {
  beforeEach(function() {
    this.mockResponse = sinon.mock(express.response);
  });

  afterEach(function() {
    this.mockResponse.restore();
  });

  describe('GET /subscriptions/:id', function() {
    it('should return a json response', function(done) {
      var request = {
        params: {
          id: 'identifier'
        }
      };

      var expectedResponse = {
        subscriptions_uri : "/subscription/identifier"
      };

      this.mockResponse
        .expects('json')
        .once()
        .withArgs(expectedResponse);

      subscription.get(request, express.response);
      setTimeout(function() {
        done();
      }, 500);
    });
  });
});

最佳答案

我决定使用 supertest 库,这使得测试我的 Controller 非常容易:

var express = require('express')
  , subscription = require('app/controllers/subscriptions')
  , request = require('supertest')
  , app = express()
  ;

describe('subscription controller', function() {
  describe('GET /subscriptions/:id', function() {
    it('should return a json response', function(done) {
      var expectedBody = {
        subscriptions_uri : "/subscription/identifier"
      };

      request(app)
        .get('/subscriptions/identifier')
        .set('Accept', 'application/json')
        .expect('Content-Type', /json/)
        .expect(expectedBody)
        .expect(200, done);
    });
  });
});

关于node.js - 测试包含异步调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15751561/

相关文章:

c# - SocketIoClientDotNet - Socket.IO 客户端库有时会发出两个连续的事件,有时不会

node.js - 设置 QUnit 测试 Kotlin - 未找到依赖项 'kotlin-test'

javascript - 异步过滤 Promise 数组

node.js - 使用Nginx作为nodejs的反向代理忽略websockets

JavaScript - 从数据库中获取值并传递给 res.render

node.js - Express.js 路由中的 DOTS 等特殊字符?

javascript - Node 中有没有一个好的库用于客户端和服务器之间的异步通信?

javascript - 将回调传递给异步函数甚至再次包装它是否正常?

c - 读取器/写入器伪代码中潜在的竞争条件

node.js - 即使在使用 sudo nohup 后 2 天后,Amazon EC2 NodeJS 服务器也会自行停止