I've been using chai to test my application, but today i faced a curious problem. I've been testing if the exception thrown in the try/catch matches with i expect, let’s check a snippet of my test code:
it('Test if validate the customer externalId', function() { let flawedCustomerArgs = [{ name: 'John', details: 'test' }] // we need to bind the parameters flawedCustomerArgs, // because in the execution context the cai method "expect" // will invoke the "importCustomer()" method chai .expect(ImportService.importCustomer.bind(ImportService, flawedCustomerArgs)) .to .throw('Field externalId not defined for Customer'); })
But let's suppose that now i need my method importCustomer to be async, the snippet code above won't work, because it will return a promise and the exception that i'm expecting is coming in the Promise Rejection.
How can i get this rejection in the chai?
If we don't want to change our previous script too much, we can declare our rejection in the test file, like this:
it('Test if validate the customer externalId', function() { let flawedCustomerArgs = [{ name: 'John', details: 'test' }] ImportService.importCustomer(flawedCustomerArgs) .then(result => (...)) .catch(error => { chai .assert .equal(error, 'Field externalId not defined for Customer') }) }) ...
But instead i used the chai-as-promised library, that allow us to get rid of writing expectations to promise in the test file and focus only in the result, like this:
const chai = require('chai'); const chaiAsPromised = require("chai-as-promised"); chai.use(chaiAsPromised); it('Test if validate the customer externalId', function() { let flawedCustomerArgs = [{ name: 'John', details: 'test' }] chai .expect(ImportService.importCustomer(flawedCustomerArgs)) .to .be .rejectedWith('Field externalId not defined for Customer'); })
If you think that there's something confusing, or impacting the understanding, or that i can improve, please i'm going to appreciate your feedback.
See you guys and thanks a lot
Top comments (0)