2013-04-28 2 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