У меня проблемы с проверкой доступа к файлам с помощью жасмина. Я пишу простой наблюдатель, который регистрирует обратный вызов с require('fs').watch
и генерирует событие, содержащее имя файла, здесь ничего особенного.
Однако, когда я пытаюсь написать тесты, которые высмеивают модуль fs
, у меня возникает несколько проблем.
Вот мой класс Watcher (CoffeeScript впереди)
class Watcher extends EventEmitter
constructor: ->
@files = []
watch: (filename) ->
if !path.existsSync filename
throw "File does not exist."
@files.push(filename)
fs.watchFile filename, (current, previous) ->
this.emit('file_changed')
А вот мои тесты:
it 'should check if the file exists', ->
spyOn(path, 'existsSync').andReturn(true)
watcher.watch 'existing_file.js'
expect(path.existsSync).toHaveBeenCalledWith 'existing_file.js'
Этот работает хорошо и проходит без каких-либо проблем, но этот полностью не работает, я не уверен, правильно ли я передаю аргументы.
it 'should throw an exception if file doesn\'t exists', ->
spyOn(path, 'existsSync').andReturn(false)
expect(watcher.watch, 'undefined_file.js').toThrow()
expect(path.existsSync).toHaveBeenCalledWith 'undefined_file.js'
И последний дает мне и странный '([У объекта] нет метода emit)', что неправильно.
it 'should emit an event when a file changes', ->
spyOn(fs, 'watchFile').andCallFake (file, callback) ->
setTimeout( ->
callback {mtime: 10}, {mtime: 5}
, 100)
spyOn(path, 'existsSync').andReturn(true)
watcher.watch 'existing_file.js'
waits 500
expect(watcher.emit).toHaveBeenCalledWith('file_changed')
Что касается второй проблемы, я просто завернул свой вызов функции в замыкание, и это сработало, но мне действительно нужно понять, почему при запуске моих тестов контекст this
полностью испорчен.