3 votes

Test unitaire de authenticateUser - aws-cognito-identity-js - sinon/proxyquire

Je suis nouveau dans le domaine de node js et des tests en général. J'ai réussi à utiliser sinon pour stub mes fonctions etc mais maintenant je dois tester une fonction qui envoie un callback en fonction d'un événement (onSuccess, onFailure).

Voici le code que je dois tester.

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

Voici ce que j'ai fait jusqu'à présent.

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

Voici ce que j'obtiens comme erreur

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)

On dirait qu'il entre dans la fonction onSuccess et qu'il ne reconnaît pas getIdToken. Mais c'est aller trop loin dans le test, non ? Je veux seulement stub/mocker authenticateUser et retourner une réponse factice.

Comment puis-je dire à Sinon de me renvoyer un callback sur 'onSuccess' sans entrer dans les détails du callback ?

Merci pour votre aide

1voto

tswaters Points 29

Vous devez passer des paramètres supplémentaires au callback via yieldsTo . par exemple,

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

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

Cela dit, il n'est peut-être pas utile de faire tester ce genre de choses à l'unité. Vous êtes essentiellement en train d'extraire une multitude de fonctionnalités tierces et pour faire quoi - vérifier qu'une fonction est appelée ?

Il serait peut-être préférable d'avoir une couverture de test pour cela sous la forme d'un test d'intégration - où vous enlevez les stubs et tapez réellement sur aws avec des informations d'identification spécifiquement utilisées pour les tests afin de vous assurer que votre application appelle tout correctement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X