2013-04-28 82 views
1

我有一個node.js應用程序,使用async utilities來破壞嵌套的回調。茉莉花未能在async.waterfall塊內調用函數

而且我試圖在我的茉莉花規格中偵測由async.waterfall包圍的函數,但總是失敗。

下面的代碼可以重現該錯誤:

async = require 'async' 

app = hi: -> 

fn = -> 
    # app.hi() # works 
    async.waterfall [ 
    (cb) -> 
     app.hi() # doesn't work 
     cb null 
    ], (err) -> 

describe 'jasmine', -> 
    beforeEach -> 
     spyOn app, 'hi' 
    it 'test async.waterfall', -> 
    spyOn app, 'hi' 
    fn() 
    expect(app.hi).toHaveBeenCalled() 

的失敗消息:

Failures: 

    1) jasmine test async.waterfall 
    Message: 
    Expected spy hi to have been called. 
    Stacktrace: 
    Error: Expected spy hi to have been called. 
    at new jasmine.ExpectationResult (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:114:32) 
    at null.toHaveBeenCalled (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:1235:29) 
    at null.<anonymous> (/Volumes/ws/prj/litb/crm/tests/job/indexSpecs.coffee:51:29) 
    at jasmine.Block.execute (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:1064:17) 
    at jasmine.Queue.next_ (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2096:31) 
    at jasmine.Queue.start (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2049:8) 
    at jasmine.Spec.execute (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2376:14) 
    at jasmine.Queue.next_ (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2096:31) 
    at jasmine.Queue.start (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2049:8) 
    at jasmine.Suite.execute (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2521:14) 
    at jasmine.Queue.next_ (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2096:31) 
    at onComplete (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2092:18) 
    at jasmine.Suite.finish (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2478:5) 
    at null.onComplete (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2522:10) 
    at jasmine.Queue.next_ (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2106:14) 
    at onComplete (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2092:18) 
    at jasmine.Spec.finish (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2350:5) 
    at null.onComplete (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2377:10) 
    at jasmine.Queue.next_ (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2106:14) 
    at null._onTimeout (/Volumes/ws/prj/litb/crm/node_modules/jasmine-node/lib/jasmine-node/jasmine-1.3.1.js:2086:18) 
    at Timer.listOnTimeout [as ontimeout] (timers.js:110:15) 

但是它傳遞,如果函數調用(這應該是一個間諜)是瀑布塊外。

我想知道我的代碼有問題嗎?或者它不被茉莉花或異步支持?

回答

2

由於waterfall是異步的,規範正在完成而沒有意識到它應該等待瀑布發生。你可以使用茉莉花的異步支持來解決這個問題,雖然茉莉花的異步的東西被認爲不是那麼好。

it 'test async.waterfall', -> 
    spy = spyOn app, 'hi' 
    runs -> 
    fn() 

    waitsFor -> 
    spy.callCount > 0 

    runs -> 
    # kind of redundant at this point, 
    # the waitsFor already asserted this 
    expect(app.hi).toHaveBeenCalled() 

另一種方法是使setTimeout和/或'的setInterval不會在您的測試環境異步。這也有缺點:

beforeEach -> 
    # I'm sure jasmine's spys can handle this too 
    # I use sinon myself, not as familiar with jasmine's spies 
    @realSetTimeout = window.setTimeout 
    window.setTimeout = (fn, delay) -> fn() 

afterEach -> 
    window.setTimeout = @realSetTimeout 

it 'test async.waterfall', -> 
    # as you have it now 
+0

謝謝,它的工作原理。實際上,在發佈這個問題之前,我確實嘗試過運行/等待,但是我把間諜放在'beforeEach'部分,並且它不起作用,那麼在'beforeEach'和spec塊中定義間諜有什麼區別? – xinthink 2013-04-28 05:13:21