Unit testing jasmine异步测试等待/运行超时

Unit testing jasmine异步测试等待/运行超时,unit-testing,testing,coffeescript,jasmine,phantomjs,Unit Testing,Testing,Coffeescript,Jasmine,Phantomjs,我有一个函数,它将一些HTML加载到页面中,然后附加DOM元素和事件侦听器,并将变量loaded设置为true(用于测试目的)。它都封装在父函数中,因此我可以传入参数并控制名称空间,需要测试的函数在返回对象中公开 ((win) -> win.PanelLoader = (args) -> loaded = false el = container: $(".container") showPanel

我有一个函数,它将一些HTML加载到页面中,然后附加DOM元素和事件侦听器,并将变量
loaded
设置为true(用于测试目的)。它都封装在父函数中,因此我可以传入参数并控制名称空间,需要测试的函数在返回对象中公开

((win) ->
    win.PanelLoader = (args) ->

        loaded = false

        el =
            container: $(".container")

        showPanel = ->
            $.get "panel.html", (data) ->
                el.container.append(data)
                attachDOMElements()
                loaded = true

        attachDOMElements = ->
            el.panel =  $(".panel")

        panelHasBeenLoaded = ->
            loaded

        showPanel()

        return {} =
            el:     el
            showPanel:  showPanel
) this
panelHasBeenLoaded()只返回false,直到AJAX请求成功。然后在我的规范文件中,我有:

it "should confirm when the panel is loaded", ->
    panelLoader = PanelLoader()
    expect(panelLoader.el.panel).toBe(undefined)
    waitsFor (->
        panelLoader.panelHasBeenLoaded()
    ), "It took too long to load in the panel", 3000
    runs ->
        expect(panelLoader.el.panel.length).toBeGreaterThan(0)
我假设它正在初始化PanelLoader,确认没有“panel”DOM元素,然后
waitsFor
应该阻塞,直到“panelHasBeenLoaded()返回true,在3秒钟后超时(应该有足够的时间,在本地主机上运行),然后运行测试,期望DOM元素现在就在那里

我遇到的问题是,它总是超时,导致第二个expect测试失败。当我在浏览器中进行测试时,它都能工作,那么为什么我的单元测试不能工作呢

我通过grunt contrib jasmine runner使用jasmine和phantom JS进行测试


谢谢

您的代码的问题是Jasmine的
waitsFor()
只适用于
runs()
块。 比如说,

runs(function() {
        asyncMethod();
        console.log('an asynchronous method');
    }, 'an asynchronous method');

    waitsFor(function() {
        return x == 1;
    }, 'x to be equal to 1', 6000);

    console.log('this executes between two runs()');

    runs(function() {
        console.log('another sequential block');
    }, 'another sequential block');
这意味着第二个
运行()
直到
等待()
时才执行,但未嵌套在
运行()
中的
控制台.log()
会在不等待的情况下执行。 我在代码中没有看到
runs()
waitsFor()
之前,这就是
waitsFor()
可能什么都不做的原因