2015-06-13 3 views
3

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

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

enter image description here

Как я могу это сделать? У меня есть догадка, что я должен макетировать файловую систему, которую я пробовал использовать модуль mock-fs, но не удалось. Путь к файлу жестко закодирован в функции, и я использую rewire для вызова неэкспортированной функции из кода моего приложения. Поэтому, когда я использую метод getter для rewire для доступа к функции getAppStatus, он использует реальный модуль fs, так как это то, что используется в файле async.js, где находится getAppStatus.

Вот код, который я тестирую:

// check whether the application is turned on 
function getAppStatus(cb){ 
    fs.readFile(directory + '../config/status.js','utf8', function(err, data){ 
    if(err){ 
     cb(err); 
    } 
    else{ 
     status = data; 
     cb(null, status); 
    } 
    }); 
} 

Вот тест, который я написал для случая, когда возвращаемые данные:

it('application should either be on or off', function(done) { 
     getAppStatus(function(err, data){ 
     data.should.eq('on' || 'off') 

     done(); 
     }) 
    }); 

Я использую Chai как библиотеки утверждения и запуска тесты с моккой.

Любая помощь, позволяющая мне смоделировать ошибку, возвращаемую из fs.readFile, поэтому я могу написать тестовый пример для этого сценария.

ответ

4

Лучше использовать mock-fs, если вы не предоставите ему файл, он вернет ENOENT. Просто будьте осторожны, чтобы вызвать восстановление после теста, чтобы избежать какого-либо воздействия на другие тесты.

Добавить в начале

var mock = require('mock-fs'); 

И тест

before(function() { 
    mock(); 
}); 
it('should throw an error', function(done) { 
    getAppStatus(function(err, data){ 
    err.should.be.an.instanceof(Error); 
    done(); 
    }); 
}); 
after(function() { 
    mock.restore(); 
}); 
+0

удивительного, спасибо за помощь, я смог получить работу в течение нескольких минут с моими тестами. Я, наверняка, ударю еще пару блокпостов, поскольку я получу оставшуюся часть этого приложения, надеюсь, что я снова смогу снова задаться вопросом, когда я столкнусь с этими, конечно же, змеями. Спасибо еще раз за помощь! :) – Antoine

Смежные вопросы