I am attempting to test this module (receiver.js) for an error thrown:
var request = require('request')
module.exports = function(url){
    request({
        url: url,
        method: 'POST'
    }, function(error) {
        if(error){
            throw error
        }
    })
}
using this test (test.js):
var test = require('tape')
test('Receiver test', function(t){
    var receiver = require('./receiver')
    t.throws(function(){
        receiver('http://localhost:9999') // dummy url
    }, Error, 'Should throw error with invalid URL')
    t.end()
})
but tape runs the assertion before the error is thrown, resulting in the following error message:
TAP version 13  
# Receiver test  
not ok 1 Should throw error with invalid URL  
  ---  
    operator: throws  
    expected: |-  
      [Function: Error]  
    actual: |-  
      undefined  
    at: Test.<anonymous> (/path/to/tape-async-error-test/test.js:5:4)  
  ...  
/path/to/receiver.js:9  
throw error  
^  
Error: connect ECONNREFUSED 127.0.0.1:9999  
    at Object.exports._errnoException (util.js:856:11)  
    at exports._exceptionWithHostPort (util.js:879:20)  
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1062:14)  
Is there a way around this?
                        
Generally, using tape, you have to ensure you call
assert.end()after the async call has completed. Using promises (would requirerequest-promiseand returning the promise):Using
async/await: