Модульный тест authenticateUser - aws-cognito-identity-js - sinon/proxyquire

Я новичок в узле JS и тестирования в целом. Мне удается использовать sinon для заглушения своих функций и т. Д., Но теперь мне нужно протестировать функцию, которая отправляет обратный вызов в зависимости от события (onSuccess, onFailure).

Вот код, который мне нужно проверить.

var AWSCognito = require('amazon-cognito-identity-js');

exports.getToken = function (options, callback) {
  var poolData = {
    UserPoolId : options.UserPoolId,
    ClientId : options.ClientId,
  };
  var authenticationData = {
    Username : options.username,
    Password : options.password,
  };
  var userPool = new AWSCognito.CognitoUserPool(poolData);
  var authenticationDetails = new AWSCognito.AuthenticationDetails(authenticationData);
  var userData = {
    Username : options.username,
    Pool : userPool
  };

  var cognitoUser = new AWSCognito.CognitoUser(userData);

  cognitoUser.authenticateUser(authenticationDetails, {
    onSuccess: function (result) {
      callback(null, {idToken: result.getIdToken().getJwtToken()});
    },
    onFailure: function (err) {
      callback(err);
    },
  });
}

это то, что я сделал до сих пор.

var proxyquire = require('proxyquire'); var should = require('should'); var sinon = require('sinon'); var AWSCognito = require('amazon-cognito-identity-js');

describe('authentication tests', function () {   var expectedResult;

  it('should invoke a lambda function correctly', function (done) {
    var options = {
      username: 'username1',
      password: 'pwd',
      UserPoolId : 'user_Pool',
      ClientId : 'clientId'
    };
    var expectedResult = {
      idToken: '123u'
    };

    var authenticateUserStub = sinon.stub().yieldsTo('onSuccess');

    var testedModule = proxyquire('../../../api/helpers/authentication.js', {
      'amazon-cognito-identity-js': {
        'CognitoUser': function () {
          return {
            authenticateUser: authenticateUserStub
          }
        }
      }
    });

    testedModule.getToken(options, function (err, data) {
      // should.not.exist(err);
      // data.should.eql(expectedResult);
      done();
    });   }); });

Это то, что я получаю как ошибку

TypeError: Cannot read property 'getIdToken' of undefined
    at onSuccess (api/helpers/authentication.js:25:38)
    at callCallback (node_modules/sinon/lib/sinon/behavior.js:95:18)
    at Object.invoke (node_modules/sinon/lib/sinon/behavior.js:128:9)
    at Object.functionStub (node_modules/sinon/lib/sinon/stub.js:98:47)
    at Function.invoke (node_modules/sinon/lib/sinon/spy.js:193:47)
    at Object.proxy [as authenticateUser] (node_modules/sinon/lib/sinon/spy.js:89:22)
    at Object.exports.getToken (api/helpers/authentication.js:23:15)
    at Context.<anonymous> (test/api/helpers/authenticationTests.js:37:18)

Похоже, что он входит в функцию onSuccess, а затем не распознает getIdToken. Но это заходит слишком далеко в тесте, нет? Я только хочу заглушить / mock authenticateUser и вернуть фиктивный ответ.

Как я могу просто попросить sinon вернуть мне обратный вызов на "onSuccess", не вдаваясь в детали обратного вызова?

Спасибо за вашу помощь

1 ответ

Вам нужно передать дополнительные параметры обратному вызову через yieldsTo, например,

const getJwtTokenStub = sinon.stub()
const authenticateUserStub = sinon.stub().yieldsTo('onSuccess', {
  getIdToken: sinon.stub().returns({getJwtToken: getJwtTokenStub})
});

// then later, 
assert.equal(getJwtTokenStub.callCount, 1)

Тем не менее, это может быть не ценно, чтобы проверить этот блок материала. Вы в основном заглушаете множество сторонних функциональных возможностей и что - проверяете, вызывается ли функция?

Наличие тестового покрытия для этого может быть лучше в качестве интеграционного теста - когда вы извлекаете заглушки и фактически получаете aws с учетными данными, специально используемыми для тестирования, чтобы убедиться, что ваше приложение вызывает все правильно.

Другие вопросы по тегам