2016-12-14 10 views
1

В настоящее время у меня есть функция, которая читает файл. Когда я бросаю и тест на ошибку за пределами ReadFile обратного вызова, он работает:Как подключить тестовую логику внутри файла FileSystem.readfile узла cb

var doWork = function(path) { 
    //throw new RangeError('blah'); // works, error is thrown 

    fs.readFile(path, 'utf-8', function(error, data) { 
     //etc.... logic.. etc.. 
     if(data.split('\n')[0] > x) 
      throw new RangeError('blah'); //does not work 
    }); 
} 

Мои тесты:

describe('my test suite', function(){ 
    it('should throw an error', function(){ 
     var func = function() { 
      doWork('my path'); 
     } 

     var err = new RangeError('blah'); 

     expect(func).to.throw(err); //no error is thrown if "throw" is inside readFile cb 
    }); 
}); 

Результаты:

AssertionError: expected [Function: func] to throw RangeError 
     at Context.<anonymous> (test.js:53:27) 
+0

https://www.joyent.com/node-js/production/design/errors – dm03514

ответ

1

для обработки ошибок в асинхронном режиме, вы можете использовать обратный вызов или обещание уведомить вызывающего абонента об ошибке.

Я думаю, что вопрос:

  • expect(func) называется
  • readFile урожаев (потому что это асинхронный) назад к испытанию
  • тест сообщает об ошибке

Вы можете изменить сигнатуру вызова doWork, чтобы принять обратный вызов (условно пройденную ошибку как первый аргумент и результат) в качестве второго аргумента.


лично я бы рекомендовал смотреть на обещания, как я думаю, что они намного чище глядя, и легче понять/работать. Это должно позволить вам продолжать бросать и регистрировать событие catch/error для обработки исключения.

0

Начиная с @ dm03514, установите логику чтения файлов как обещание, так как вы не можете напрямую тестировать броски асинхронно.

// fileprocessor.js 
'use strict'; 

//imports 
var Promise = require('bluebird'); 
var fs = Promise.promisifyAll(require('fs')); 

module.exports = class FileProcessor { 
    constructor() { 

    } 

    process(path) { 
     var deferred = Promise.pending(); //like $q.deferred() in angular 

     fs.readFileAsync(path, 'utf8').then(content => { 
      //... etc... logic... etc... 
      if(content.split('\n')[0] > 10) deferred.reject(new RangeError('bad')); 

      //... etc.. more... logic 
      deferred.resolve('good'); 
     }).catch(error => deferred.reject(error)); 

     return deferred.promise; 
    } 
} 

Затем в ваших тестовых пакетах.

//test.js 
'use strict'; 

var chai = require('chai'); 
var expect = chai.expect; 
var chaiAsPromised = require('chai-as-promised'); 
chai.use(chaiAsPromised); 
var FileProcessor = require('./fileprocessor.js'); 

describe('my test suite', function(){ 

    var func =() => { 
     return new FileProcessor().process('my path'); 
    } 

    it('should resolve with a value',() => { 
     return expect(func).should.eventually.equal('good'); 
    }); 

    it('should reject with an error',() => { 
     return expect(func).should.be.rejectedWith(RangeError); 
    }); 
}); 

Посмотрите chai-as-promised: http://chaijs.com/plugins/chai-as-promised/