Adobe ColdFusion 2016测试盒BDD elvis运营商问题

Adobe ColdFusion 2016测试盒BDD elvis运营商问题,coldfusion,bdd,coldfusion-2016,Coldfusion,Bdd,Coldfusion 2016,更新:为此问题提交了错误报告 您可以调用?:as elvis运算符/三元运算符/空共线性。在ACF中,关于该操作员的适当文档的实现和运气非常差。在TestBox(尝试了v2.3.0+00044和2.2.0+00021)BDD中使用它时存在一些问题。在这里,我创建了非常简单的测试包(aTest.cfc)来演示这个问题 component extends="testbox.system.BaseSpec"{ function run(){ describe( "checki

更新:为此问题提交了错误报告


您可以调用?:as elvis运算符/三元运算符/空共线性。在ACF中,关于该操作员的适当文档的实现和运气非常差。在TestBox(尝试了v2.3.0+00044和2.2.0+00021)BDD中使用它时存在一些问题。在这里,我创建了非常简单的测试包(aTest.cfc)来演示这个问题

component extends="testbox.system.BaseSpec"{
    function run(){
        describe( "checking the ACF issues in ternary operaors", function(){
            it( "Just dump, it will pass. But see the dump above", function(){
                itemTypeConfig = {};
                writeDump( itemTypeConfig.someConfig ?: "I am null" );

                itemTypeConfig = {"someConfig":"abcd"};
                writeDump( itemTypeConfig.someConfig ?: "I am null" );
            } );

            it( "Check with elvis operator inside expect", function(){
                itemTypeConfig = {};
                expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);

                itemTypeConfig = {"someConfig":"abcd"};
                expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);
            } );

            it( "Check with expect with some temp variable", function(){
                itemTypeConfig = {};
                var actualResult = itemTypeConfig.someConfig ?: "I am null";
                expect( actualResult ).toBe(1);

                itemTypeConfig = {"someConfig":"abcd"};
                var actualResult = itemTypeConfig.someConfig ?: "I am null";
                expect( actualResult ).toBe("abcd");
            } );    

            it( "Check with expect with struct key exists", function(){
                itemTypeConfig = {};
                if ( structkeyexists(itemTypeConfig, "someConfig") )
                    var actualResult = itemTypeConfig.someConfig;
                else
                    var actualResult = 1;
                expect( actualResult ).toBe(1);

                itemTypeConfig = {"someConfig":"abcd"};
                if ( structkeyexists(itemTypeConfig, "someConfig") )
                    var actualResult = itemTypeConfig.someConfig;
                else
                    var actualResult = 1;
                expect( actualResult ).toBe("abcd");

            } );    

        } );
    }
}
在Lucee中运行这个测试用例时,没有问题。但是在AdobeColdFusion中,我得到了错误。请参阅随附的测试结果屏幕截图。 1.你们可以看到,在第一个规范中,转储是未定义的

  • 在第二个规范中,如果在expect中指定elvis操作符,
    expect(itemTypeConfig.someConfig?:“I am null”).toBe(1)它给出的是未定义的实际值

  • 在第三个规范中,我尝试使用临时变量作为变通方法来修复规范2中实际未定义的问题
    
    itemTypeConfig={};
    var actualResult=itemTypeConfig.someConfig?:“我为空”;
    期望值(实际结果).toBe(1);
    
    但它给出的实际结果是未定义的

  • 在第四个规范中,我使用struckkeyexists,但没有在BDD测试套件中使用这个三元操作符&它工作得很好


  • 我试图在独立的cfm文件中创建类似的行为,但我无法复制它。我不确定这是testbox中的问题,还是ACF在闭包中处理elvis操作符。我不确定描述此问题的确切术语

    这是Adobe ColdFusion 2016版中的一个解析错误。(它在ColdFusion 11中工作)。我将您的示例简化为演示此问题的代码。只有将闭包调用嵌套到至少2个深度时,才会发生这种情况

    clos = function( func ) { func(); };
    
    clos( function(){
        clos( function(){
            writeDump( foo ?: "I am null" );
        } );
    } );
    
    如您所报告的,输出为“未定义”,但预期为“我为空”

    请去火车站买票。在修复之前,您将无法在BDD测试中使用elvis运算符


    我建议简化您的问题,使用更小的复制案例。

    如果您尝试在每个
    itemTypeConfig
    定义之前添加
    var
    ,会怎么样。如下所示:
    var itemTypeConfig={}。即使var与此上下文无关,我也已经尝试过了。非常感谢您的建议。您能将其简化为一行代码(或者3或4行代码)来单独显示问题吗?我认为这个问题有很多代码和解释,所以它被略过了,因为它需要花费很多时间来深入研究和理解。非常感谢你的简化示例来模拟我的问题&正如你提到的这个示例&我的测试套件在CF 11中运行良好,但在CF 2016中没有,我将在Adobe bug base中记录一个bug