我想将导入的模块替换为存根,以便专注于仅对主模块进行单元测试。我已经尝试过使用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); }); });
我在这里做错什么了吗?任何帮助将不胜感激。
答案 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
。