2016-07-09 21 views
1

ich ein Versprechen Funktion haben, die eine Authentifizierung auf den Clients CookieWie man richtig ein Versprechen Objekt Stummel, die Teil eines anderen Versprechen ist

const getInitialState = (id_token) => { 
    let initialState; 
    return new Promise((resolve,reject) => { 
    if(id_token == null){ 
     initialState = {userDetails:{username: 'Anonymous',isAuthenticated: false}} 
     resolve(initialState) 
    }else{ 
     var decoded = jwt.verify(JSON.parse(id_token),'rush2112') 
     db.one('SELECT * FROM account WHERE account_id = $1',decoded.account_id) 
      .then(function(result){ 
      console.log('result is : ',result) 
      initialState = {userDetails:{username:result.username,isAuthenticated:true}} 
      resolve(initialState) 
      }) 
      .catch(function(err){ 
      console.log('There was something wrong with the token',e) 
      reject('There was an error parsing the token') 
      }) 
    } 
    }) 
} 

getInitialState ist ein Versprechen Objekt, das ruft eine Datenbankfunktion (ein anderes Versprechen basiert führt Objekt), wenn der Cookie gültig ist.

Ich möchte den db Anruf hier stumm zu einem Benutzernamen auflösen. Aber es funktioniert nicht, egal was ich versuche

Ich versuchte zwei Bibliotheken sinonStubPromise und sinon-as-promised. Aber beide scheinen in einem Timeout-Fehler zu führen, die mir sagt, dass die db Funktion isnt

aufgelöst zu werden Ich glaube, ich bin nicht der db Funktion stubbing richtig

das sind die verschiedenen Möglichkeiten, wie ich versucht habe

stub2 = sinon.stub(db,'one') 

stub2.returnsPromise().resolves({username:'Kannaj'}) 

oder

sinon.stub(db,'one').returns({username:'Kannaj'}) 

oder

sinon.stub(db,'one') 
     .withArgs('SELECT * FROM account WHERE account_id = $1',1) 
     .returns({username:'Kannnaj'}) 

oder

let db = sinon.stub(db).withArgs('SELECT * FROM account WHERE account_id = $1',1).returns({username:'Kannnaj'}) 

führen alle zu einem Timeout-Fehler von Mokka

Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test. 

diese Funktion meine gesamte Test ist

it('should return a valid user if id_token is valid',function(){ 
    id_token = '{"account_id":1}' 
    console.log('stub1: ',stub1(), typeof(stub1)) 
    console.log('stub2 : ',stub2,typeof(stub2)) 

    // my attempts here 
    return expect(getInitialState(id_token)).to.eventually.be.true 
    }) 

Aus irgendeinem Grund glaube ich, Mokka/sinon ist den pg-promise-Kontext verlieren, sobald es db.any aufruft. nicht sicher warum.

+0

Muss etwas mit der Stub-Sache sein, weil 'pg-promise' selbst 100% Testabdeckung ohne Probleme bietet. Hast du gesehen, wie es sich selbst testet? Vielleicht wird das helfen;) –

Antwort

0

Ich kann nicht mit sinon-as-promised oder sinonStubPromise sprechen, aber Sie brauchen sie nicht, um so etwas zu erreichen.

const sinon = require('sinon'); 
const chai = require('chai'); 
chai.use(require('chai-as-promised')); 
const expect = chai.expect; 

// real object 
const db = { 
    one: function() { 
    // dummy function 
    } 
}; 

// real function under test 
function foo() { 
    return db.one('SELECT * FROM account WHERE account_id = $1'); 
} 

describe('foo', function() { 
    beforeEach(function() { 
    sinon.stub(db, 'one') 
     .withArgs('SELECT * FROM account WHERE account_id = $1') 
     .returns(Promise.resolve({username: 'Kannaj'})); 
    }); 

    it('should not timeout', function() { 
    return expect(foo()) 
     .to 
     .eventually 
     .eql({username: 'Kannaj'}); 
    }); 

    afterEach(function() { 
    db.one.restore(); 
    }); 
}); 
+0

Ich weiß nicht, warum es immer noch gibt mir einen Fehler .. könnte es sein, dass db.one ist selbst ein Versprechen Objekt und die Hauptversprechen Funktion ist nicht in der Lage, die .then Methode zu fangen? – Kannaj

+0

Ich hatte das gleiche Problem und ich habe es versucht. Immer noch Zeitüberschreitung. Hat das jemand gelöst? – ChickenWing24