2015-02-22 4 views
1

Я пытаюсь проверить, вызывается ли res.json() в методе экспресс-получения.Тестирование методов экспресс-маршрута

Однако в моем методе get он ждет обещания перед выполнением res.json();

Вот метод управления:

function get(req, res, next) { 

    Service 
     .doImportantThings() 
     .then(success, error); 

    function success(result) { 
     res.json(result); // Method i want to test. 
    } 

    function error(error) { 
     // Handles it 
    } 
} 

Услуги:

function doImportantThings() { 
    var deferred = q.defer(); 

    doStuff 
     .then(success, error); 

    function success(results) { 
     deferred.resolve(output); 
    } 

    function error() { 
     deferred.reject(); 
    } 

    return deferred.promise; 
} 

Тест:

beforeEach(function() { 
     var Service = require('../../../../app/services/service'); 
     ServiceMock = sinon.mock(Service); 
     methodExpect = ServiceMock.expects('doImportantThings').returns(q.resolve("test")); 
     res.json = sinon.spy(); 

     expressController = require('../../../../app/controllers/v1/controller'); 
    }); 

    afterEach(function() { 
     ServiceMock.restore(); 
    }); 

    describe('get()', function() { 

     it('should call res.json() one time', function() { 
      expressController.get(req, res);  
      expect(res.json).to.have.been.calledOnce; // Fails 
     }); 

     it('should call res.json() with object argument.', function() { 
      expressController.get(req, res) 
      expect(res.json).to.have.been.calledWith("test"); // Fails 


     }); 

    }); 

Потому что я использую обещает ожидать всегда возвращает ложь. Я пытался использовать обратный вызов mocha done() без успеха. Я также попытался поместить обратный вызов в качестве параметра контроллера и сделать вызов оттуда или ожидать там, но тест либо истекает, либо не утверждается.

Все ответы, которые я нашел, говорят о том, как использовать supertest, который, вероятно, будет работать, но я хочу проверить это, не делая HTTP-запрос на ресурс, чтобы это сделать.

ответ

0

Я только что решил ту же проблему и в конце решил обернуть мой метод «получить» в обещании, чтобы мой тест завершился после того, как обещание будет разрешено. Я вызываю res.send в своем маршруте. Я переместил свою логику из файла маршрутов в отдельный файл, который выглядит так, как вы могли бы это сделать. Таким образом, это фактически то, что я в настоящее время:

/routes.js

var routeMethods = require('./methods'); 

router.get('/get-data/:id', function(req, res) { 

    routeMethods.getTheData(req.params.eventId).then(

     (result) => { 
      res.status(result.statusCode).send(result.response); 
     }); 
    }); 
} 

/methods.js

var externalTools = require('./externalTools.js'); 

var routeMethods = { 

    getTheData: function (id) { 

     return new Promise((resolve, reject) => { 

      externalTools.getDataFromExternalService(id) 

       .then((externalResponse) => { 

        resolve({'statusCode': externalResponse.statusCode, 
          'response': externalResponse.body}); 

       }, (errorDetails) => { 

        reject({'statusCode': errorDetails.statusCode, 
          'response': errorDetails.error + ' ' + id}); 

       }); 
     }); 
    } 
}; 

module.exports = routeMethods; 

/tests.js

var expect = require('chai').expect, 
    request = require('request'), 
    should = require('chai').should(), 
    sinon = require('sinon'), 
    methods = require('./methods'); 

describe('get data routes', function() { 

    describe('getData', function() { 

     it('should return the correct statusCode and error summary when theres a whapi error', function (done) { 

      sinon 
       .stub(request, 'get') 
       .yields('404', {'statusCode': 404}, JSON.stringify({"faults": [{"faultCode": "10003","faultString": "Resource not found - test","faultName":""}]})); 

      methods.getTheData('1234').then(

       (response) => {}, 
       (response) => { 

        expect(response.statusCode).to.equal(404); 
        done(); 
       }); 

      request.get.restore(); 

     }); 

    }); 

}); 
Смежные вопросы