2016-05-06 6 views
0

Я пытаюсь выполнить тестирование объекта мангуста, который использует обещания. Я написал тест ниже, и он работает, но он не завершен. Я не могу понять, как проверить, вызваны ли методы «then» или «catch».Единичные тесты мангуста с сиконом

Как я могу использовать шпион, чтобы проверить, вызван ли метод «then», когда я разрешаю обещание?

Метод тестирования

export function create(req, res) { 
    User 
    .createAsync(req.body) 
    .then(handleCreate(res, req.originalUrl)) 
    .catch(handleError(res)); 
} 

тест Блок

it('should do something',() => { 
    const req = { 
    body: 45, 
    }; 

    const res = {}; 

    const mockRole = sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    controller.create(req, res); 
}); 

UPDATE с решением I ИСПОЛЬЗУЕМЫХ (6 мая 2016 года)

Спасибо @ReedD за помощь в правильном направлении

Хотя это «работает», I f как я тестирую функциональность обещаний больше, чем мой код.

it('should call create with args and resolve the promise',() => { 
    const createSpy = sinon.spy(); 
    const errorSpy = sinon.spy(); 

    sandbox.stub(responses, 'responseForCreate').returns(createSpy); 
    sandbox.stub(responses, 'handleError').returns(errorSpy); 

    sandbox.mock(Role).expects('createAsync').once().withArgs(45) 
    .returns(Promise.resolve()); 

    return controller.create(req, res).then(() => { 
    expect(createSpy.calledOnce).to.be.equal(true); 
    expect(errorSpy.calledOnce).to.be.equal(false); 
    }); 
}); 

ответ

1

Вы можете добавить handleCreate и handleError к module.exports, а затем сделать заглушки или spys тех. Ниже приведен пример того, что я думаю, что вы пытаетесь сделать. Я также предположил, что вы используете синон/чай.

http://ricostacruz.com/cheatsheets/sinon-chai.html

// controller.js 

module.exports = { 
    handleCreate: function() { 
     // ..code 
    }, 
    handleError: function() { 
     // ..code 
    }, 
    create: function (req, res) { 
     User 
      .createAsync(req.body) 
      .then(this.handleCreate(res, req.originalUrl)) 
      .catch(this.handleError(res)); 
    } 
}; 



// test/test.js 

var controller = require('../controller'); 

it('should do something', function (done) { 

    var handleCreate = sandbox.spy(controller, 'handleCreate'); 
    var handleError = sandbox.spy(controller, 'handleError'); 
    var mockRole  = sandbox 
     .mock(Role) 
     .expects('createAsync') 
     .once().withArgs(45) 
     .returns(Promise.resolve()); 


    var req = { 
     body: 45, 
    }; 

    var res = { 
     send: function() { 
      expect(handleCreate).to.be.calledOnce; 
      expect(handleError).to.not.be.called; 
      done(); 
     } 
    }; 

    controller.create(req, res); 
}); 
+0

Спасибо. Это привело меня к правильному пути решения, которое я использовал. В конце концов, я чувствую, что я всего лишь блок, тестирующий функциональность Promises: D – VtoCorleone

+0

Правда, этот модульный тест гарантирует, что ваша функция 'create' работает правильно. Вы должны написать больше модульных тестов, чтобы независимо убедиться, что 'handleCreate' и' handleError' также работают правильно. – ReedD