Пересмешливая файловая система с jasmine и node.js - PullRequest
2 голосов
/ 07 августа 2011

У меня проблемы с проверкой доступа к файлам с помощью жасмина. Я пишу простой наблюдатель, который регистрирует обратный вызов с 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 полностью испорчен.

Ответы [ 2 ]

2 голосов
/ 07 августа 2011

См. этот вопрос

Я думаю, что вам нужно сделать:

expect(-> watcher.watch 'undefined_file.js').toThrow 'File does not exist.'

, которая определяет анонимную функцию, которую может вызывать сопоставитель ожидаемого значения во время фактического запуска теста, в отличие от времени определения теста.

Для вашей второй проблемы вы можете вызывать toHaveBeenCalled только для шпионского объекта Жасмин, но не для произвольной функции.Вы можете просто обернуть функцию, выполнив

spyOn(watcher, 'emit').andCallThrough()

См. документацию по API жасмина в Spy.andCallThrough ()

0 голосов
/ 14 августа 2017

Вы можете использовать memfs для проверки файловой системы.

...