web-dev-qa-db-fra.com

sinon le talon ne remplace pas la fonction.

J'ai essayé un module factice et le stub, mais cela ne fonctionne pas.

the app.js

function foo()
{
    return run_func()
}
function run_func()
{
    return '1'
}
exports._test = {foo: foo, run_func: run_func}

le test.js

app = require("./app.js")._test
describe('test', function(){
    it('test', function(){

        var test_stub = sinon.stub(app, 'run_func').callsFake(
          function(){
            return '0'
        })
        test_stub.restore()

        var res = app.foo()
        assert.equal('0', res)
    })
})

J'ai essayé les conseils de: sinon le talon ne remplace pas la fonction

Mais toujours pareil. Il ne remplace pas la fonction.

8
J.R.

Vous avez quelques problèmes ici. La première est que vous appelez test_stub.restore() immédiatement après avoir créé le stub, ce qui le fait se remplacer par la fonction d'origine, annulant ainsi complètement le stub.

restore est destiné à nettoyer les fausses méthodes après votre test est terminé. Vous voulez donc l'appeler, mais vous devez le faire dans un afterEach.

Votre deuxième problème est un peu plus subtil. Sinon fonctionne en écrasant une référence à une fonction sur un objet, en la faisant pointer vers autre chose (dans ce cas, le talon). Il ne peut pas remplacer les références à la même fonction dans d'autres contextes.

Lorsque vous appelez sinon.stub(app, 'run_func'), c'est un peu comme ceci:

app.run_func = sinon.stub()

... sauf que l'ancienne méthode stocke la valeur et le nom d'origine de app.run_func, ce qui vous permet de les restaurer facilement plus tard.

Notez qu'à ce stade, la variable app pointe vers le même objet que vous avez exporté avec exports._test = {foo: foo, run_func: run_func} Votre fonction foo, cependant, ne fait pas référence à run_func Via ce objet. C'est le référencer directement dans le cadre de app.js, Qui sinon ne peut pas affecter.

Jetez un œil à l'exemple suivant. Vous remarquerez également que j'ai nettoyé quelques autres choses:

app.js:

exports.foo = function() {
    return exports.run_func();
};

exports.run_func = function() {
    return '1';
};

test.js:

const app = require('./app');
const sinon = require('sinon');

describe('app', function() {
    describe('foo', function() {
        beforeEach(function() {
            sinon.stub(app, 'run_func').returns('0');
        });

        afterEach(function() {
            app.run_func.restore();
        });

        it('returns result of app.run_func', function() {
            assert.equal(app.foo(), '0');
        });
    });
});

Notez comment exports dans app.js Fait exactement référence au même objet que app fait dans test.js. Cela est dû au fait que les modules du noeud exportent par défaut un objet vide, que vous pouvez affecter à l'aide de la variable exports.

13
sripberger