2016-02-24 3 views
0

Следуя аналогичному шаблону this example Я пытаюсь проверить свои маршруты в приложении Express.js, но я не могу заставить своего шпиона проверить, что res.render был вызван при упаковке в promise.then.Тестирование Express.js res.render в рамках обещания с шпионами Mocha & Sinon

Вот упрощенный пример, где я ожидал бы, что calledOnce будет правдой, но возвращает false.

Код тестируемой:

var model = { 
    get: function() { 
    return new Promise(function(res, rej) { 
     return res('success'); 
    }); 
    } 
}; 

module.exports = function (req, res) { 
    model.get().then(function (data) { 
    res.render('home', data); 
    }).catch(function (err) { 
    console.log(err); 
    }); 
}; 

Тест:

var expect = require('chai').expect; 
var sinon = require('sinon'); 
var home = require('./home'); 

describe('home route', function() { 
    it('should return a rendered response', function() { 
    var req = {}; 

    var res = { 
     render: sinon.spy() 
    }; 

    home(req, res); 

    expect(res.render.calledOnce).to.be.true; 
    }); 
}); 

ответ

3

Вы должны ждать обещанного, чтобы решить, что является асинхронной операцией.

Поскольку Мокко поддерживают обещания изначально, вы можете настроить свой код, чтобы передать оригинальное обещание всего пути обратно к Mocha, и вставить тестовый случай в цепи:

// home.js 
... 
module.exports = function (req, res) { 
    // return the promise here 
    return model.get().then(function (data) { 
    res.render('home', data); 
    }).catch(function (err) { 
    console.log(err); 
    }); 
}; 

// test.js 
describe('home route', function() { 
    it('should return a rendered response', function() { 
    var req = {}; 
    var res = { render: sinon.spy() }; 

    // Also return the promise here, and add an assertion to the chain. 
    return home(req, res).then(function() { 
     expect(res.render.calledOnce).to.be.true; 
    }); 
    }); 
}); 
+0

Спасибо, что это решить мою проблему ! – chrisdwheatley

Смежные вопросы