Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.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.JS存根推荐的方法?_Javascript_Node.js_Mocha.js_Sinon_Chai - Fatal编程技术网

Javascript 如何使用Sinon.JS存根推荐的方法?

Javascript 如何使用Sinon.JS存根推荐的方法?,javascript,node.js,mocha.js,sinon,chai,Javascript,Node.js,Mocha.js,Sinon,Chai,给定以下代码: (请注意,已承诺访问) 我的单元测试不起作用,因为调用的是realaccess方法,而不是stubbed方法: const chai = require('chai') const chaiAsPromised = require('chai-as-promised') const custom = require('./custom') const fs = require('fs') const sinon = require('sinon') chai.use(chaiA

给定以下代码: (请注意,已承诺访问)

我的单元测试不起作用,因为调用的是real
access
方法,而不是stubbed方法:

const chai = require('chai')
const chaiAsPromised = require('chai-as-promised')
const custom = require('./custom')
const fs = require('fs')
const sinon = require('sinon')

chai.use(chaiAsPromised)
const expect = chai.expect

describe('custom', () => {
  let sandbox = sinon.createSandbox()

  afterEach(function () {
    sandbox.restore()
  })

  it('should return file exists true', () => {
    sandbox.stub(fs, 'access').yields(null)
    return expect(custom()).to.eventually.equal('File exists: true')
  })

  it('should return file exists false', () => {
    const error = new Error('No such file or directory')
    error.code = 'ENOENT'
    sandbox.stub(fs, 'access').yields(error)
    return expect(custom()).to.eventually.equal('File exists: false')
  })
})
如何使测试工作,givem
access
custom.js
文件中给出了说明

参考资料:

更新问题已更新。在底部回答原始问题

你要找的是。 问题是
custom.js
需要自己的
fs
,并且您正在测试文件中存根
fs
Proxyquire
将需要一个文件,并替换该文件所需的任何文件/函数

在你的例子中,它是这样的。 (用摩卡咖啡运行)

测试文件:

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const proxyquire = require('proxyquire');

chai.use(chaiAsPromised);
const expect = chai.expect;

describe('custom', () => {
    let custom;

    const stubs = {
        fs: {
            accessAsync: () => {
                // Since you mentioned that fs was promisified, we will
                // make this a promise as well.
                return Promise.resolve();
            }
        },
        bluebird: {
            // Stop bluebird from promisifying, since we handle it above.
            promisifyAll: (req => req),
        }
    };

    before(async function () {
        custom = proxyquire('./custom', stubs);
    });

    it('should return file exists true', () => {
        return expect(custom()).to.eventually.equal('File exists: true');
    });
});
custom.js

'use strict';

const bluebird = require('bluebird');
const fs = bluebird.promisifyAll(require('fs'));

module.exports = async function() {
    let exists = true;
    await fs.accessAsync('nonimportant.path', fs.constants.F_OK)
        .catch( () => { exists = false; });
    return `File exists: ${exists}`;
};
原始答案

在这种情况下,不需要使用蓝鸟,Sinon可以处理

你需要使用这个函数。可以这样做:

const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const sinon = require('sinon');
const fs = require('fs');

chai.use(chaiAsPromised);
const expect = chai.expect;

describe('fs.stat', function(){
    before(function() {
        sinon.stub(fs, 'stat').resolves('Your desired value');
    });

    it('should should be called', function(done){
        expect(fs.stat('./some.file'))
            .to.eventually.equal('Your desired value')
            .notify(done);
    });
});

谢谢你的回复。正如我所说,fs.stat已经发布,所以我需要一个示例来演示如何存根它。在您的示例中,您展示了fs.stat将在原始版本中使用:使用回调而不是承诺。真是个好发现!非常感谢你。看来proxyquire就是解决方案。我正在尝试运行您的单元测试,但是我从chai得到了经典的超时错误2s。“错误:超过2000ms的超时。对于异步测试和挂钩,请确保调用了“done()”;如果返回承诺,请确保它已解析。“在不调用done的情况下应该可以工作,因为您正在将承诺返回给descripe方法,并且正在使用chai as promission。”。在您的环境中运行时,您的示例通过了吗?不,抱歉。我没有做那个测试。这更像是一个概念证明,为你指明了正确的方向。为了完整性起见,我将使用一个工作示例测试进行更新。抱歉等待,我正忙于工作。我将测试修复为实际工作,并包含了我一直用于测试的
custom.js
文件。如果答案对您有帮助,请记住标记为已接受:)Hi Enslev。再次感谢您的回复。我也能用蓝鸟的promisifyAll使它工作。这在创建新的accessAsync方法时起作用。但我不想仅仅为了使用特定的promisified方法而许诺整个包。因此,我只提出了访问方法。我不想放弃,并试图找到一个解决方案,因为我有许多其他用户的情况下,现场promisified方法。。。非常感谢你的努力。我可以接受你的回答是正确的,但我仍有一个悬而未决的问题需要调查:-(这里似乎有些混乱:通过测试Promisified fs.stat的回调,您基本上是在尝试确保Bluebird的Promisify按预期工作。不需要这样做,Bluebird开发人员已经这样做了。您的现有/不存在文件测试也已经由node.js人员完成,因此无需测试该文件。)另外,你可能想透露你想测试的内容/原因…谢谢你的回答,我用我想测试的部分逻辑更新了这个问题。
const chai = require('chai');
const chaiAsPromised = require('chai-as-promised');
const sinon = require('sinon');
const fs = require('fs');

chai.use(chaiAsPromised);
const expect = chai.expect;

describe('fs.stat', function(){
    before(function() {
        sinon.stub(fs, 'stat').resolves('Your desired value');
    });

    it('should should be called', function(done){
        expect(fs.stat('./some.file'))
            .to.eventually.equal('Your desired value')
            .notify(done);
    });
});