[=10th=] 构造函数上的节点 js sinon js 存根

nodejs sinonjs stub on class construcor

我正在使用 nodejs exif 库从 JPEG 文件中检索元数据。

这个库是这样使用的:

import * as exif from 'exif'

new exif.ExifImage('path_to_file.jpg', function(err, metadata){ ... })

我到处都找到了如何使用 sinon 存根 class 方法,非常简单。

但我不知道如何存根这个 class 构造函数,以便 metadata (如果我想测试失败的情况,则错误)将是存根值我需要进行测试。

我们仍然可以使用具有 callsFake 功能的 Sinon。这是示例:

// src.js

const exif = require("exif");

function readImage() {
  // convert to promise for easier testing
  return new Promise((resolve, reject) => {
    new exif.ExifImage("path_to_file.jpg", function(err, metadata) {
      if (err) {
        reject(err);
      }

      resolve(metadata);
    });
  });
}

module.exports = { readImage };

同时进行测试

// test.js

const sinon = require('sinon');
const src = require('./src');
const exif = require('exif');
const expect = require('chai').expect;

describe('test exifimage', () => {
  let exifStub;

  beforeEach(function() {
    exifStub = sinon.stub(exif, 'ExifImage')
  })

  afterEach(function() {
    sinon.restore();
  })

  it('test when success', async () => {
    const metadata = 'cinta';

    // mock ExifImage as similar as its function signature
    exifStub.callsFake((filename, callback) => {
      callback(null, metadata); // error is set as null then we set metadata
    });

    const response = await src.readImage();

    expect(response).to.equal(metadata);
  });

  it('test when error', async () => {
    const errorMessage = 'this is error';

    exifStub.callsFake((filename, callback) => {      
      callback(errorMessage); // specify error, error is defined as first param
    });

    try {
      await src.readImage();
    } catch (error) {
      expect(error).to.equal(errorMessage);
    }
  });
});

希望对您有所帮助