Strange fs.readFile behavior while testing CoffeeScript with Mocha/Chai

Please consider I have the following CoffeeScript code:

class Foobar
    test: (path) ->
        fs = require 'fs'
        fs.readFile path, (err, data) ->
            console.log 'fs.readFile callback fired'

root = exports ? window
root.Foobar = Foobar

And the following test file for Mocha:

chai = require 'chai'
expect = chai.expect
chai.should()

{Foobar} = require '../source/foobar'

describe 'Foobar', ->
    foobar = null
    it 'does nothing', ->
        foobar = new Foobar
        foobar.test 'foobar.txt'

I run the test:

mocha --compilers coffee:coffee-script -R spec

Strangely for me console logs nothing. When I change my Coffee to this (added two lines at the end):

class Foobar
    test: (path) ->
        fs = require 'fs'
        fs.readFile path, (err, data) ->
            console.log 'fs.readFile callback fired'

root = exports ? window
root.Foobar = Foobar

foobar = new Foobar
foobar.test 'foobar.txt'

I run the test, and now console logs fs.readFile callback fired twice, as expected.

So, why console was empty in the first case?

It's possible that your tests are ending before the readFile callback is executed. The test method should accept a callback:

class Foobar
    test: (path, callback) ->
        fs.readFile path, (err, data) ->
            console.log 'fs.readFile callback fired'
            callback err, data

That way you can write your test to run asynchronously:

it 'calls callback', (done) ->
    foobar = new Foobar()
    foobar.test 'foobar.txt', done