【问题标题】:How can I use dijit/regisrty in an Intern functional test如何在实习生功能测试中使用 dijit/registry
【发布时间】:2014-03-17 18:20:27
【问题描述】:

我在功能测试中使用任何 dojo 模块时遇到问题,我不断看到 window 未定义错误或 document 未定义。

我目前正在尝试像这样使用dijit/registry(目前只导入它的模块)..

define([
    'intern!object',
    'intern/chai!assert',
    'require',
    'dijit/registry'
], function (registerSuite, assert, require, registry) {
    registerSuite({

        name: 'login',

        'load and login': function () {
            return this.remote.get(require.toUrl('http://application.co.uk/'))
                .elementById('input1')
                    .click()
                    .type("username")
                    .end()
                .elementById('input2')
                    .click()
                    .type("password")
                    .end()
                .elementById('rememberMe')
                    .click()
                    .end()
                .elementByName('Login.Submit')
                    .click()
                    .end()
                .wait(5000)
                .title()
                .then(function (title) {
                    assert.strictEqual(title, 'Application title');
                });
        }
    });
});

...并且从节点收到以下错误...

$ ./libs/intern/bin/intern-runner.js config=test/intern
Defaulting to "runner" reporter
Listening on 0.0.0.0:9000

c:/.../libs/dojo/_base/unload.js:6
var win = window;
          ^
ReferenceError: window is not defined
    at c:/.../libs/dojo/_base/unload.js:6:11
    at execModule (c:\...\libs\intern\node_modules\dojo\dojo.js:512:54)
    at c:\...\libs\intern\node_modules\dojo\dojo.js:501:12
    at Array.map (native)
    at execModule (c:\...\libs\intern\node_modules\dojo\dojo.js:496:17)
    at c:\...\libs\intern\node_modules\dojo\dojo.js:501:12
    at Array.map (native)
    at execModule (c:\...\libs\intern\node_modules\dojo\dojo.js:496:17)
    at c:\...\libs\intern\node_modules\dojo\dojo.js:501:12
    at Array.map (native)

我读过之前的问题about using dojo/text! in a similar way,这似乎表明实习生的 geezer 版本可能可以处理这个问题?

没有注册表模块,测试运行良好。

更新

好吧,根据 C Snover 的响应,您不能在 webdriver execute() 方法之外利用像 dijit/registry 这样的任何东西,因为代码需要在 Web 浏览器的上下文中,而不是在功能测试中。

【问题讨论】:

    标签: javascript dojo functional-testing intern


    【解决方案1】:

    功能测试在 Node.js 中运行,而不是在浏览器环境中运行。如果你想访问你正在测试的页面中加载的dijit/registry实例,你需要使用execute在远程环境中运行一个函数:

    return this.remote
      .get('http://application.co.uk')
      .execute(function () {
        // this function runs in the browser!
    
        var registry = require('dijit/registry');
        // ... do things with registry
    
        return something;
      })
      .then(function (something) {
        // this function runs inside the test runner!
    
        assert.isTrue(something);
      });
    

    您将无法从功能测试模块定义具有 DOM 要求的依赖项(例如 dijit/registry)。只有基于浏览器的单元测试模块才能加载此类依赖项。

    【讨论】:

    • 我做了那个改变,但我没有进入我所期望的注册表,即。访问小部件。如果我遍历regisrty.toArray() 中的所有小部件,那么我只会得到很多未定义的项目,而不是预期的小部件。我是否应该期望看到已在浏览器中实例化的所有小部件?或者我不能在这样的功能测试中使用注册表吗?
    • 您可以从execute 函数中执行您想要的任何代码,它将在浏览器中运行。但是,您可以传递回测试运行程序(通过返回它们)的唯一对象是可以序列化为 JSON 的值,以及 DOM 元素引用,这是 WebDriver API 中的一种特殊情况。
    • 很公平,所以我不能像我希望的那样使用 dojo 进行功能测试,没关系。如果我尝试使用测试失败的 Web 浏览器的控制台,我如何才能为已执行的脚本获得更好的反馈,有什么想法吗?
    【解决方案2】:

    还有 dijit-intern-helper -> https://github.com/SitePen/dijit-intern-helper

    所以这个

    executeAsync(function (done) {
        require(['dijit/registry'], function (registry) {
            done(registry.byId('titlePane').titleBarNode);
        });
    })
    .then(function (node, setContext) {
        setContext(node);
    })
    .click()
    

    变成

    .then(dijit.nodeById('titlePane', 'titleBarNode'))
    .click()
    

    关于它的博客文章 -> https://www.sitepen.com/blog/simplified-dijit-functional-testing/

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2015-06-18
      • 2016-02-11
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多