web-dev-qa-db-ja.com

console.log呼び出しのSinonスパイが登録されていません

シノンについて学びたいのですが、console.logをスパイしたいと思っています。コードは簡単です:

function logToConsole() {
    console.log('Hello World');
}

exports.logToConsole = logToConsole;

しかし、テストしたい場合、console.logの呼び出しがテスト対象のシステム内に登録されていないため、機能しません。

var chai = require('chai'),
    expect = chai.expect,
    sinonChai = require('sinon-chai'),
    sinon = require('sinon'),
    sut = require('../src/logToConsole');

chai.use(sinonChai);

describe('logToConsole', function() {
    it('should spy on console.log', function() {
        sinon.spy(console, 'log');

        sut.logToConsole();

        expect(console.log).to.have.been.called;
    });
});

ただし、テスト自体の中でconsole.logを実行すると、キャプチャされてパスします。

it('should spy on console.log', function() {
    sinon.spy(console, 'log');

    sut.logToConsole();
    console.log('Test');

    expect(console.log).to.have.been.called;
});

興味深いことに、内部関数呼び出しをスパイすることはまったくできないようです。これはスパイライブラリの目的ではありませんか?

例えば.

function a() {};

function b() {
    a();
}
18
user2511874

実際にsinon-chaiを使用していないようです。投稿したコードに次の行がありません:

chai.use(sinonChai);

[〜#〜] edit [〜#〜]:これは私がテストしたコードです:

// test.js
var chai = require('chai'),
    expect = chai.expect,
    sinonChai = require('sinon-chai'),
    sinon = require('sinon'),
    sut = require('./log');

chai.use(sinonChai);

describe('logging', function() {

  beforeEach(function() {
    sinon.spy(console, 'log');
  });

  afterEach(function() {
    console.log.restore();
  });

  describe('logToConsole', function() {
    it('should log to console', function() {
      sut.logToConsole();
      expect(console.log).to.be.called;
    });
  });

  describe('logToConsole2', function() {
    it('should not log to console', function() {
      sut.logToConsole2();
      expect(console.log).to.not.be.called;
    });
  });
});

// log.js
module.exports.logToConsole = function() {
  console.log('Hello World');
};

module.exports.logToConsole2 = function() {
};
21
robertklep