2011-08-07 75 views
2

我在用茉莉花測試我的文件訪問時遇到了問題。我正在寫一個簡單的觀察器,用require('fs').watch註冊一個回調函數,併發出一個包含文件名稱的事件,這裏沒有什麼特別的。用jasmine和node.js嘲笑文件系統

但是,當我嘗試編寫模擬fs模塊的測試時,我遇到了幾個問題。

這裏是我的觀察類(進取的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' 

,最後一個給我和奇「([對象]不具有法發出)」,這是錯誤的。

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

this question

我認爲你需要做的:

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

其中定義了一個匿名函數的期望匹配可實際試運行過程中調用,在測試定義的時間,而不是。

對於第二個問題,您只能在茉莉間諜對象上調用toHaveBeenCalled,而不是任何任意函數。你可以只包住函數做

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

the jasmine API docs on Spy.andCallThrough()

+0

是的,謝謝,我已經想出瞭如何解決第一個問題。那麼你的解決方案似乎更簡單,並且像魅力一樣工作。 –

0

可以使用memfs對文件系統的嘲弄。