Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我如何利用sinon监视中的嵌套依赖项_Javascript_Testing_Sinon - Fatal编程技术网

Javascript 我如何利用sinon监视中的嵌套依赖项

Javascript 我如何利用sinon监视中的嵌套依赖项,javascript,testing,sinon,Javascript,Testing,Sinon,我成功地测试了一个基本的express服务器、一个返回承诺的函数和一个基本的sequelize设置,让我的鼻子湿润了;但我被间谍/存根/嘲弄所困扰 我的第一个小问题是试图检查glob是否已在外部模块中调用: //in utils.js var glob = require('glob'); module.exports = { funToTest: function (msg, callback) { console.log(msg); glob('*md', {

我成功地测试了一个基本的express服务器、一个返回承诺的函数和一个基本的sequelize设置,让我的鼻子湿润了;但我被间谍/存根/嘲弄所困扰

我的第一个小问题是试图检查glob是否已在外部模块中调用:

//in utils.js
var glob = require('glob');

module.exports = {
  funToTest: function (msg, callback) {
    console.log(msg);
    glob('*md', {
      cwd: 'files/'
    }, function (err, files) {
      console.log(files);
    });
    callback();
    callback();
  }
};
使用摩卡/柴/西农/西农-柴组合:

// in utils-test.js
var utils = require('utils.js');
var glob = require('glob');

describe('Utils', function () {
  describe('funToTest method', function () {
    const callback = sinon.spy();
    const globSpy = sinon.spy(glob);

    before(function (done) {
      utils.funToTest('Files:', callback);
      done();
    });

    // This PASSES fine
    it ('should call our callback twice', function () {
      expect(callback).to.have.been.calledTwice;
    });

    // This NOT SO MUCH
    it('should call glob once', function () {
      expect(globSpy).to.have.been.calledOnce;
    });
  )};
)};
上述操作失败,并出现断言错误:

AssertionError:预期glob只被调用了一次,但被调用了0次


那么,我如何监视
utils.funToTest
中的glob依赖项,以查看是否调用了glob?

您监视的是glob模块本身,而不是
funToTest
方法中的glob调用。问题是glob调用是一个实现细节,实际上无法从测试中访问。您需要为glob回调传递一个参数,并测试它是否是用间谍或存根调用的

//in utils.js
var glob = require('glob');

module.exports = {
  funToTest: function (msg, globCb, callback) {
    glob('*md', {
      cwd: 'files/'
    }, globCb);
    callback();
    callback();
  }
};

// in utils-test.js
var utils = require('utils.js');
var glob = require('glob');

describe('Utils', function () {
  describe('funToTest method', function () {
    const callback = sinon.spy();
    const globCb = sinon.spy();

    const err = {err: 'Error'};
    const files = ['file1', 'file2'];

    before(function (done) {
      utils.funToTest('Files:', globCb, callback);
      done();
    });

    // Should still pass
    it ('should call our callback twice', function () {
      expect(callback).to.have.been.calledTwice;
    });

    // Passes with correct args
    it('should call glob once', function () {
      expect(globCb).to.have.been.calledOnce;
      // inspect the arg values with .calledWithArgs
      expect(globCb.calledWithArgs(err, files)).to.be.true;
      // inspect the arg values with .getCall(index) (actually grabs the call args on the first call to globSpy)
      expect(globCb.getCall(0).args[0]).to.equal(err);
      expect(globCb.getCall(0).args[1]).to.equal(files);
    });
  )};
)};

下面是使用附加库
proxyquire
的单元测试解决方案:

utils.js

const glob=require(“glob”);
module.exports={
funToTest:函数(消息,回调){
控制台日志(msg);
地球仪(
“*md”,
{
cwd:“文件/”,
},
函数(错误,文件){
console.log(文件);
},
);
回调();
回调();
},
};
utils.test.js

const proxyquire=require(“proxyquire”);
const sinon=要求(“sinon”);
描述(“36477213”,()=>{
之后(()=>{
sinon.restore();
});
它(“应该通过”,()=>{
const logSpy=sinon.spy(控制台,“日志”);
常量文件=[“a”,“b”];
const globStub=sinon.stub().yields(null,文件);
const-utils=proxyquire(“./utils.js”{
glob:globStub,
});
const callback=sinon.stub();
utils.funToTest(“一些消息”,回调);
assert.calledWith(globStub,“*md”,{cwd:”files/“},sinon.match.func);
sinon.assert.calledTwice(回调);
sinon.assert.calledWith(logSpy.firstCall,“一些消息”);
sinon.assert.calledWith(logSpy.secondCall,文件);
});
});
100%覆盖率的单元测试结果:

36477213
一些信息
[‘a’、‘b’]
✓ 应该通过
1次通过(24毫秒)
---------------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
---------------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
utils.js | 100 | 100 | 100 | 100 ||
utils.test.js | 100 | 100 | 100 | 100 ||
---------------|----------|----------|----------|----------|-------------------|
源代码:

您是否尝试过“expect(globspy.calledOnce).to.be.true”?