2015-02-24 10 views
8

Jak powinienem testować, z mocha i chai, że moja obietnica zawiodła?testowanie nieudanych obietnic z wbudowaną obsługą obietnicy mokki

Jestem zdezorientowany, bo początkowo myślałem, należy używać „mocha-as-obiecał”, ale że pakiet jest teraz przestarzała (używam mocha 2.1.0), z doradztwa prostu użyć obiecuj testy, które teraz są wbudowane w mokkę. zobaczyć: https://github.com/domenic/mocha-as-promised

Kolejny post zaleca rezygnacji z „Gotowe” argument do to() callback - nie bardzo rozumiem dlaczego, skoro moje zrozumienie, że przechodzącą w „Gotowe” parametrem była droga do sygnalizowania że test był testowany asynchronicznie. patrz: How do I properly test promises with mocha and chai?

W każdym razie próbowałem ograniczyć mój problem do kodu podanego poniżej - pomóż mi zmodyfikować to, aby przetestować, czy moja obietnica rzeczywiście zawodzi.

it.only("do something (negative test)", function (done) { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    makePromise() 
    .then(done, done); 

}); 

Odpowiedz

3

Możesz powrócić obietnicę, aby zasygnalizować, że test jest asynchroniczne:

function something() { 
    return Q.reject(Error('fail')); 
} 

it('should reject', function() { 
    return something().then(function() { 
    throw new Error('expected rejection'); 
    }, 
    function() { 
    return 'passed :]'; 
    }); 
}); 
10

Niektóre bardziej kopania, i wydaje się, że właściwą drogą jest dodanie dodatkowego bloku catch, tak jak ...

it.only("do something (negative test)", function (done) { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    makePromise() 
    .catch(function(e) { 
    expect(e.message).to.equal('fail'); 
    }) 
    .then(done, done); 

}); 

Jestem zainteresowany alternatywnymi pomysłami lub potwierdzeniem, że tak jest dobrze ... dzięki.

UPDATE:

Ben - I teraz grok, co mówiłeś, zwł. po lakonicznym komentarzem ale pomocny od Benjamin G.

Podsumowując:

Po przejechaniu w parametrze done oczekuje się, że test wywołać to „done-Ness” poprzez wywołanie funkcji done();

Jeśli nie podasz parametru done, normalnie działa on tylko w przypadku wywołań synchronicznych. Jednakże, , jeśli przyjmiesz obietnicę, powłoka mokka (mocha> 1.18) przyniesie obietnice, które normalnie zostałyby połknięte (zgodnie ze specyfikacją obietnicy). Tutaj jest zaktualizowana wersja:

it.only("standalone neg test for mocha+promises", function() { 

    var Q = require('q'); 

    function makePromise() { 
    var deferred = Q.defer(); 
    deferred.reject(Error('fail')); 
    return deferred.promise; 
    }; 

    return makePromise() 
    .catch(function(e) { 
    expect(e.message).to.equal('fail'); 
    }); 

}); 
+2

Możesz "zwrócić' 'makePromise()' i usunąć 'done, done' part. –

+0

Dodałbym dodatkową asercję, aby upewnić się, że nie trafiła ona w przypadek akceptacji. 'powrócić makePromise() .then (() => {// sprawa akceptacji, nie powinniśmy spodziewać się tutaj () nie ('wyjątek nie wydaje się być rzucony');.. } (e) => { // Przypadek awarii, powinniśmy tu dotrzeć, a komunikat powinien odpowiadać oczekiwać (e.message) .to.equal ('fail'); }); ' – gmetzker

1

chai-as-promised zapewnia czystą testowania ramy Promises:

$ npm install chai-as-promised 

W pliku testowego:

var chai = require('chai'); 
var expect = chai.expect; 
var chaiAsPromised = require("chai-as-promised"); 
chai.use(chaiAsPromised); 

... 

it('resolves as promised', function() { 
    return expect(Promise.resolve('woof')).to.eventually.equal('woof'); 
}); 

it('rejects as promised', function() { 
    return expect(Promise.reject('caw')).to.be.rejectedWith('caw'); 
}); 

Ten czuje się czysty i intuicyjny. Ale możesz zrobić coś podobnego bez tak obiecanego:

it('resolved as promised', function() { 
    return Promise.resolve("woof") 
     .then(function(m) { expect(m).to.equal('woof'); }) 
     .catch(function(m) { throw new Error('was not supposed to fail'); }) 
      ; 
}); 

it('rejects as promised', function() { 
    return Promise.reject("caw") 
     .then(function(m) { throw new Error('was not supposed to succeed'); }) 
     .catch(function(m) { expect(m).to.equal('caw'); }) 
      ; 
}); 
+0

Próbuję użyć Chai-as-Promised, moja metoda asynchroniczna zwraca obietnicę odroczonej biblioteki (https://www.npmjs.com/package/deferred). Kiedy przeprowadzam test, dostaję się poniżej błędu. czy odroczona jest wspierana przez tę mudulę? "TypeError: Nie można odczytać właściwości", a następnie "z undefined" –

+0

@PiyushBeli: upewnij się, że formularz, który "zasila" 'then', zwraca obietnicę. Na przykład upewnij się, że zawiera instrukcję return. –

Powiązane problemy