2016-11-24 3 views
0

Я хочу изменить requestHandler.value на 5 для моих функциональных тестов.Измените предопределенное значение на сервере перед функциональным тестом

При запуске пакета создание 1000 документов в db на самом деле не является вариантом, поэтому можно ли программно изменить его значение перед запуском пакета и затем выполнить его сброс? Я могу создать 5 документов в db перед тестом для работы.

Из грубого я могу заглушить 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(); 
     }); 
    }); 
    }); 
}); 
+0

Можете ли вы объяснить свой прецедент для жесткого кодирования 1000 на сервере? Ответ на этот вопрос изменит ответ, который я бы дал. – user3137190

ответ

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