2017-03-21 16 views
10

Używam testdouble do wywoływania kodu pośredniczącego w moim projekcie node.js. Ta konkretna funkcja jest opakowaniem obietnicy i ma wiele wywołań then w samej funkcji.Testowanie obietnic z wieloma testami za pomocą 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)); 
}); 
} 

Więc ja chcąc ustalić, czy resolve i reject są obsługiwane prawidłowo oparta na warunkach błędach. Załóżmy, że istnieje tam niestandardowa logika, którą muszę zweryfikować.

Dla mojego testu

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

problem jest, że wynik Połącz musi być obietnica, więc używam następnie rozwiązać z wartością, która musi być kolejna obietnica, że ​​rozwiązuje lub odrzuca.

Linia, której dotyczy, jest wynikiem database.connect() nie jest obietnicą.

TypeError: Cannot read property 'then' of undefined 

Ktoś ma powodzenie z wywoływaniem tego typu połączenia z Test Double?

+0

Czy możesz podać błąd, który otrzymujesz? –

+0

@ ckross01 Umysł pokazujący nam błąd i/lub stacktrace? – GPX

+0

Dodałem błąd do pytania o zasadniczo to stwierdza, że ​​wynik 'database.connect' nie jest obietnicą. – ckross01

Odpowiedz

1

Tak ustalono rozdzielczość. Jest kilka rzeczy do zapamiętania w rozwiązaniu i które napotkaliśmy. W skrócie rozdzielczość zakończyła się tym, że ...

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

Rozwiązuje to możliwość, która jest zwracana, gdy test podwójnie widzi połączenie z bazą danych. Następnie można również dodawać kolejne połączenia.

Jest też część, aby pamiętać, jeśli wyślesz w obiekcie do database.connect() trzeba mieć świadomość, że robi sprawdzanie === równość i trzeba będzie mieć odniesienie do tego obiektu na to, aby poprawnie korzystać td.when.

0

Podwójny test zawiera kody do testowania jednostkowego. W twoim przypadku "db" jest obiektem, który musimy udawać. Tworzenie db szyderczy przez

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

będzie dobrym wyborem, ale po prostu wyśmiewać tych metod musisz w tym przypadku, nie będę wybierać w ten sposób.

Oto sprawdzony moduł „some.js”:

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; 

i plik testowy, używając mokka i chai.expect, która może być także każdy inny moduł testów jednostkowych tutaj:

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

Proszę dać mi znać, jeśli którekolwiek z nich wprowadzają w błąd.

Powiązane problemy