заглушка nodejs sinonjs на конструкцию класса - PullRequest
0 голосов
/ 14 мая 2019

Я использую библиотеку nodejs exif для извлечения метаданных из файлов JPEG.

эта библиотека используется следующим образом:

import * as exif from 'exif'

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

Я нашел вездекак заглушить метод класса с помощью sinon, довольно просто.

Но я не понимаю, как заглушить этот конструктор класса, чтобы метаданные (или ошибаться, если я хочу проверить неудачный случай)будет значением заглушки, которое мне нужно для выполнения теста.

1 Ответ

0 голосов
/ 23 мая 2019

Мы все еще можем использовать 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);
    }
  });
});

Надеюсь, это поможет

...