【问题标题】:jasmine asynchronous testing waitsFor/runs timeoutjasmine 异步测试等待/运行超时
【发布时间】:2013-06-27 01:14:15
【问题描述】:

我有一个函数可以将一些 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,确认没有“面板”DOM 元素,然后 waitsFor 应该阻塞直到 `panelHasBeenLoaded() 返回 true,3 秒后超时(应该有足够的时间,从 localhost 运行),然后它运行测试,期望 DOM 元素现在在那里。

我遇到的问题是它总是超时,导致第二个期望测试失败。当我在浏览器中测试时一切正常,为什么我的单元测试不起作用?

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

谢谢

【问题讨论】:

    标签: unit-testing testing coffeescript jasmine phantomjs


    【解决方案1】:

    您的代码的问题是 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');
    

    表示第二个runs()直到waitsFor()才执行,但是console.log()没有嵌套在runs()中,不等待就执行。 在您的代码中,waitsFor() 之前我没有看到 runs(),这就是为什么 waitsFor() 可能什么都不做。

    【讨论】:

      猜你喜欢
      • 2017-06-01
      • 2014-09-23
      • 2016-09-04
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多