如何将导入的模块替换为存根

时间:2018-07-13 06:29:02

标签: node.js mocha sinon

我想将导入的模块替换为存根,以便专注于仅对主模块进行单元测试。我已经尝试过使用sinon.stub,但由于我在运行测试时不断出现错误,因此似乎没有达到我的期望。

    { Error: Command failed: identify: unable to open image `test.exe': No such file or directory @ error/blob.c/OpenBlob/2724.
    identify: no decode delegate for this image format `EXE' @ error/constitute.c/ReadImage/504.

        at ChildProcess. (/node_modules/imagemagick/imagemagick.js:88:15)
        at ChildProcess.emit (events.js:159:13)
        at maybeClose (internal/child_process.js:943:16)
        at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5) timedOut: false, killed: false, code: 1, signal: null }

这是我的主要模块。


    // src/services/identifyService.js
    import imagemagick from 'imagemagick';

    class IdentifyService {
        async identify(filePath) {
            imagemagick.identify(['-format', '%w_%h', filePath], function(err, output) {
                if (err) reject(err);

                return resolve(output);
            });
        }
    }

这是我的考验。


    // test/identifyService.test.js
    import imagemagick from 'imagemagick';
    import IdentifyService from '../src/services/identifyService';

    describe('Verify image processing', () => {
        before(() => {
            const fileInfo = [{page: 1, width:100, height: 100, colorspace: 'RGB'}];
            sinon.stub(imagemagick, 'identify').returns(fileInfo);
        });

        it('returns metadata', (done) => {
            const metadata = IdentifyService.identify('test.exe');
            expect(metadata).to.have.lengthOf(0);
        });
    });

我在这里做错什么了吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

首先,我发现IdentifyService类存在与promise用法有关的问题。

class IdentifyService {
  identify(filePath) {
    return new Promise((resolve, reject) => { // create a new promise
      imagemagick.identify(['-format', '%w_%h', filePath], function (err, output) {
        if (err) reject(err);

        resolve(output); // no need to specify `return`
      });
    });
  }
}

对于测试本身,它必须对yields使用imagemagick.identify,因为它是callback的函数。

describe('Verify image processing', () => {
    before(() => {
        const fileInfo = [{page: 1, width:100, height: 100, colorspace: 'RGB'}];
        sinon.stub(imagemagick, 'identify').yields(null, fileInfo); // use yields
    });    

    it('returns metadata', async () => {
        const metadata = await IdentifyService.identify('test.exe');
        expect(metadata).to.have.lengthOf(0);
    });
});

我认为您的环境支持async await