【问题标题】:How to override testClass methods with Siesta?如何用 Siesta 覆盖 testClass 方法?
【发布时间】:2018-05-13 04:41:02
【问题描述】:

我正在使用 Bryntum Siesta 来测试 ExtJS 应用程序的 UI。我创建了一个TestClass,旨在将其方法用于不同的视图。测试的整个动作是相同的,只是一些特定的事情发生了变化,例如package、view、grid 名称。以下是来自 Test Suite 的一些 sn-ps:

主测试类

var isDisplaying =  'Grid is displaying now.';
var collapseDesc = 'Collapse Navbar';

Class('Siesta.Test.ListScreen', {

    isa     : Siesta.Test.ExtJS,

    methods: {
        navigation: function (callback) {
            var t = this;

            t.chain(
                {waitForCQ: 'treelist[itemId=navigationTreeList]'},

                function (next) {
                    t.click('treelist[itemId=navigationTreeList]');
                    next();

                },
                {click: '>> treelistitem[_text=Package_Name]'},
                {click: '>> treelistitem[_text=Package_Submodule]', desc: 'Package Submodule'+isDisplaying},
                {click: '#main-navigation-btn => .fa-navicon', desc: collapseDesc},

                function (next) {
                    console.log('navigation func log');
                    next();
                },

                callback
           )
       }
   }
});

这个 testClass 从Package_Submodule 调用并获得成功:

describe('UI Testing: Submodule List Screen', function (t) {

    //Extended method for navigation to submodule
    t.it('Should open: Submodule Grid', function (t) {
        t.chain(
            {
                navigation: t.next
            }
        )
    });
});

这里的事情是我想为另一个子模块调用相同的TestClass 方法并覆盖几个东西,例如Package_Name 和Package_Submodule。我怎样才能成功做到这一点?

提前致谢


更新通过 JackSamura 的回答:

亲爱的@SamuraiJack 我重构了主类(ListScreen)并插入了has 属性。还用config 属性修改了harness,但不幸的是它没有覆盖myPackageName 或mySubModule。而不是我得到这个错误:

Waiting for element ">> treelistitem[_text=packageName]" to appear  

我也尝试过使用函数参数,但也没有用。你能告诉我为什么我不能覆盖新值吗?

主类(更新):

   var isDisplaying =  'Grid is displaying now.';
   var collapseDesc = 'Collapse Navbar';

    Class('Siesta.Test.ListScreen', {

        isa     : Siesta.Test.ExtJS,

        has : {
          myPackageName : 'packageName',
          mySubModule   : 'subModule'
        },

        methods: {
            navigation: function (callback) {
                var t = this;

                t.chain(
                    {waitForCQ: 'treelist[itemId=navigationTreeList]'},

                    function (next) {
                        t.click('treelist[itemId=navigationTreeList]');
                        next();

                    },
                    {click: '>> treelistitem[_text='+this.myPackageName+']'},
                    {click: '>> treelistitem[_text='+this.mySubModule+']', desc: this.mySubModule+isDisplaying},
                    {click: '#main-navigation-btn => .fa-navicon', desc: collapseDesc},

                    function (next) {
                        console.log('navigation func log');
                        next();
                    },

                    callback
               )
           }
       }
    });

index.js:

group: 'UI Tests',
    items: [
        {
            group: 'Submodule List Screen',
            testClass: Siesta.Test.ListScreen,
            items: [
                {
                    title           : 'Submodule1',
                    hostPageUrl     : localApp,
                    url             : '02-ui-tests/02_01-submodule-list-screen/submodule1-list.t.js',
                    config      : {
                        myPackageName     : 'Package1',
                        mySubModule       : 'Submodule1'
                    }
                },

【问题讨论】:

    标签: javascript class extjs ui-testing siesta


    【解决方案1】:

    您可以通过两种方式做到这一点:

    1) 为“导航”方法添加参数:

    // callback should be the last one
    navigation: function (packageName, packageSubModule, callback) {
    

    可能不言自明

    2) 稍微复杂一点 - 为您的自定义测试类添加新属性:

    Class('Siesta.Test.ListScreen', {
    
        isa     : Siesta.Test.ExtJS,
    
        has : {
            // values goes into prototype, like in Ext
            myPackageName : 'packageName',
            mySubModule   : 'subModule'
        },
    
        methods: {
    

    然后你可以像往常一样在“导航”方法中引用那些属性:this.myPackageName

    然后,要覆盖,您可以创建一个新的测试类(子类化Siesta.Test.ListScreen)并重新定义其中的属性,或者使用测试描述符的 config 属性:

    harness.start(
        {
            url         : 'mytest.t.js',
            config      : {
                myPackageName     : 'value1',
                mySubModule       : 'value2'
            }
        },
        ...
    )
    

    提示:为了更快地获得答案 - 将其发布到 Siesta 论坛:https://www.bryntum.com/forum/viewforum.php?f=20

    更新:

    您得到的错误可能是因为“导航”方法是从子测试启动的(每个“t.it()”或“t.describe()”部分都会创建一个单独的“子测试”)。这些子测试不会应用配置 - 它仅应用于顶级测试。一种解决方案是复制属性值:

        // in the "methods" of the custom test class
        processSubTestConfig : function (config) {
            var cfg = this.SUPER(config)
    
            cfg.myPackage = this.myPackage
            ...
    
            return cfg
        },
    

    但这已经是高级 Siesta 内部编码了。可能只使用函数参数会更简单..

    【讨论】:

    • 亲爱的@SamuraiJack 感谢您的建议。我一直在实施这两个方面并理解这个过程。顺便说一句,不幸的是,我没有获得访问 Bryntum 论坛的授权,因为它是付费的。现在我正在使用免费的 Lite 版本的 Siesta 进行个人开发。
    • 我已经更新了基于问题的建议实施,但出现了几个错误。您能否查看更新的部分。非常感谢。
    • Bryntum 论坛是免费的,请尝试注册。也欢迎 Siesta Lite 用户使用它。
    • “Bryntum 论坛是免费的”几乎是我今天得到的最佳答案 :) 到目前为止,我已经尝试通过菜单栏的 Log In 按钮登录,该按钮进入客户区.刚才注意到董事会索引底部有 Register 链接:))
    • 欢迎加入 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多