Как правильно заглушить запрос-обещание в модульном тесте мокко с использованием sinon?

Мой юнит тест:

describe.only("Validator Service Tests", function () {
  let request
  before((done) => {
    request = sinon.stub()

    done()
  })

  beforeEach(() => {
    process.env.API_URL = "http://test"
  })

  it('Should return with no errors if the file matches the schema', () => {
    const updateStatusSpy = sinon.spy(FileLib, 'updateStatus')
    request.yields({message: 'ok'})

    return ValidatorService.handleMessage({
      file: 'test'
    })
    .then((response) => {
      assert()
      console.log(response)
      sinon.assert.calledOnce(updateStatusSpy)
      assert(response, 'f')
    })
  })

})

Проблема моя handleMessage функция, которая выглядит так:

exports.handleMessage = (message, done) => {
  return stuff()
  .then((result) => {
    console.log('result', result)
    if(result) {
      return FileLib.updateStatus(fileId, 'valid')
    }
    return FileLib.updateStatus(fileId, 'invalid')
  })
  .then(done)
}

И мой updateStatus функция:

exports.updateStatus = function(fileId, status) {
  console.log(fileId, status)
  return request.put({
    uri: `${process.env.API_URL}/stuff/${fileId}`,
    body: {
      status: status
    }
  })
}

Мой актуальный request Звонок похоронен так глубоко, как я могу заглушить его при тестировании?

1 ответ

Решение

Я не уверен, что полностью понимаю ваш вопрос, но если вы просто пытаетесь поставить заглушку, попробуйте что-то вроде этого:

let stub;

beforeEach(() => {
    putStub = sinon.stub(request, 'put').resolves('some_val_or_object'); //or yields or callsFake, depending on what you're using
});

it('should call request with put', async () => {
    await //call your code

    expect(putStub.called).to.be.true;
    expect(putStub.calledWith(whatever_you_want_to_check)).to.be.true;
});
Другие вопросы по тегам