在功能测试之前更改服务器上的预定义值

时间:2016-11-24 13:16:56

标签: javascript integration-testing

我希望将requestHandler.value更改为5以进行功能样式测试。

运行套件时,在db中创建1000文档实际上不是一个选项,所以可以在运行套件之前以编程方式更改它的值,然后重置它吗?我可以在测试之前在db中创建5个文档。

粗略的我可以在单元测试中存根countDocumentsInDb()以返回我需要的东西,但为了这个问题,我在下面简化了逻辑。

app.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var requestHandler = require('./lib/requestHandler.js');
var PORT = 4000;

app.route('/validate')
  .get(function(req, res) {
    requestHandler.process(req, res);
  });

if (!module.parent) {
  server.listen(PORT, function(err) {
    if (err) {
      return;
    }
  });
}

module.exports = app;

requestHandler.js

var requestHandler = {

  value: 1000,

  process: function(req, res) {

    numberOfDocumentsInDb = countDocumentsInDb();

    if (numberOfDocumentsInDb === this.value) {
      res.send(true);
    } else {
      res.send(false);
    }
  }
};

module.exports = requestHandler;

FVT样式测试..

var Promise = require('promise');
var request = require('supertest');
var chai = require('chai');
chai.should();
var server = require('../../app.js');

describe('app.js', function() {
  describe('/validate', function() {

    it('should return true if number of documents in db matches pre-defined value', function(done) {
      var fvtPromise = new Promise(function(fulfill) {
        request(server)
          .get('/validate')
          .expect(200)
          .end(function(err, res) {
            if (err) {
              throw err;
            }
            res.body.should.equal(true);
            fulfill(null);
          });
      });
      fvtPromise.done(function() {
        done();
      });
    });
  });
});

1 个答案:

答案 0 :(得分:1)

您可以使用 require.cache ,这样您就可以修改requestHandler的值。
只是一个例子,我希望你能得到这个想法 - 在每次修改需要缓存之前,设置测试值
- 在每次设置之后返回原始值
- 请注意const server = require('./app.js');在测试中,因此它将占用缓存值 例如

describe('test with cache', function(){
    require('./requestHandler');
    let originalValues;

    beforeEach(function() {
        originalValues = require.cache[ require.resolve('./requestHandler') ].exports;

        require.cache[ require.resolve('./requestHandler') ].exports = {
                    value:5,
                    process: function(req, res) {
                        //other stuff    
                    }
            };

    });

    afterEach(function() {        
        require.cache[ require.resolve('./requestHandler') ].exports = originalValues;        
    });

    it('should pass', function(){
        const server = require('./app.js');

        var fvtPromise = new Promise(function(fulfill) {
            request(server)
            .get('/validate')
            .expect(200)
            .end(function(err, res) {
                if (err) {
                throw err;
                }
                res.body.should.equal(true);
                fulfill(null);
            });
        });
        fvtPromise.done(function() {
            done();
        });

        expect(true).to.be.true;
    });
});