class construcor上的nodejs sinonjs存根

时间:2019-05-14 19:00:58

标签: node.js sinon stub

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

这个库是这样使用的:

import * as exif from 'exif'

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

我到处都发现了如何使用sinon对类方法进行存根,非常简单。

但是我不知道如何对这个类的构造函数进行存根处理,以使元数据(或者如果我想测试失败的情况下会出错)将成为执行测试所需的存根值。

1 个答案:

答案 0 :(得分:0)

我们仍然可以将Sinon与callsFake函数一起使用。这是示例:

// 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);
    }
  });
});

希望有帮助