2017-03-21 3 views
10

का उपयोग करके एकाधिक तह के साथ परीक्षण वादे का परीक्षण मैं अपने node.js प्रोजेक्ट में कॉल को रोकने के लिए testdouble का उपयोग कर रहा हूं। यह विशेष कार्य एक वादा लपेट रहा है और इसमें फ़ंक्शन के भीतर कई then कॉल हैं।testdoublejs

function getUser (rethink, username) { 
    return new Promise((resolve, reject) => { 
    let r = database.connect(); 
    r.then(conn => database.table(tablename).filter({username})) 
    .then(data => resolve(data)) 
    .error(err => reject(err)); 
}); 
} 

तो मैं अगर resolve और reject सही ढंग से त्रुटि की स्थिति के आधार पर नियंत्रित किया जाता है निर्धारित करने के लिए इच्छुक हूँ। मान लें कि वहां कुछ कस्टम तर्क हैं जिन्हें मुझे सत्यापित करने की आवश्यकता है।

अपने परीक्षण

import getUser from './user'; 
import td from 'testdouble'; 
test(t => { 
    const db = td.object(); 
    const connect = td.function(); 
    td.when(connect('options')).thenResolve(); 
    const result = getUser(db, 'testuser'); 
    t.verify(result); 
} 

मुद्दे के लिए कि कनेक्ट का परिणाम एक वादा करने की आवश्यकता है, इसलिए मैं तो का उपयोग जो एक और वादा है कि निराकरण या खारिज कर दिया की जरूरत है एक मूल्य के साथ हल।

यह लाइन database.connect() का परिणाम है एक वादा नहीं है।

TypeError: Cannot read property 'then' of undefined 

किसी को भी इस प्रकार के कॉल को टेस्ट डबल के साथ दबाकर सफलता मिली है?

+0

क्या आप जो त्रुटि प्राप्त करते हैं उसे प्रदान कर सकते हैं? –

+0

@ ckross01 मन हमें त्रुटि और/या एक स्टैकट्रस दिखा रहा है? – GPX

+0

मैंने अनिवार्य रूप से इस सवाल में त्रुटि को जोड़ा कि यह 'डेटाबेस.कनेक्ट' का नतीजा बता रहा है, यह वादा नहीं है। – ckross01

उत्तर

1

तो संकल्प को समझ लिया। समाधान में कुछ चीजें ध्यान देने योग्य हैं और हमें सामना करना पड़ा। संक्षेप में संकल्प समाप्त हो गया ...

td.when(database.connect()).thenResolve({then: (resolve) => resolve('ok')}); 

यह तब एक हल करने योग्य हल करता है जब परीक्षण डबल डेटाबेस कनेक्ट को देखता है। फिर बाद में कॉल भी जोड़ा जा सकता है।

वहाँ भी नोट करने के लिए यदि आप database.connect() को एक वस्तु में भेजने जैसा कि आप जानते हैं कि यह === समानता की जाँच और आप उस वस्तु के लिए एक संदर्भ के लिए इसे सही ढंग से td.when उपयोग करने के लिए की आवश्यकता होगी कर रहा है होना है एक हिस्सा है।

0

टेस्ट डबल यूनिट परीक्षण के लिए स्टब्स प्रदान करता है। और आपके मामले में 'डीबी' वह वस्तु है जिसे हमें नकल करने की आवश्यकता है। के माध्यम से

td.object(Database) // Database is the class or constructor of your db

मजाक डाटाबेस बनाना सही विकल्प होगा, लेकिन केवल उन तरीकों आप इस मामले में जरूरत उपहास करने के लिए, मुझे लगता है कि जिस तरह से लेने नहीं होगा। ,

function getUser (database, username) { 
    return new Promise((resolve, reject) => { 
    let r = database.connect(); 
    r.then(conn => database.table('table').filter({username:username})) 
     .then(data => resolve(data)) 
     .catch(err => reject(err)); 
    }); 
} 

module.exports = getUser; 

और परीक्षण फ़ाइल मोचा और chai.expect, जो है भी यहां किसी अन्य इकाई परीक्षण मॉड्यूल हो सकता है का उपयोग करते हुए:

यहाँ, परीक्षण किया मॉड्यूल है 'some.js'

let td = require('testdouble'); 
let expect = require('chai').expect; 

const getUser = require('./some'); 

describe('some.js',()=>{ 
    it('getUser',()=>{ 
    const db = {}; 
    const name = 'name'; 
    db.connect = td.function(); 
    db.table = td.function('table'); 
    db.filter = td.function('filter'); 
    td.when(db.connect()).thenResolve(db); 
    td.when(db.table('table')).thenReturn(db); 
    td.when(db.filter({username: name})).thenResolve('some user data'); 
    return getUser(db, name) 
     .then(user=>{ 
     expect(user).to.equal('some user data') 
     }) 
     .catch(e=>assert(e)) 
    }) 
}) 

तो कृपया मुझे बताएं कि इनमें से कोई भी आपको भ्रमित करता है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^