Adobe ColdFusion 2016 testbox BDD elvis 运算符问题

Adobe ColdFusion 2016 testbox BDD elvis operator issue

更新:针对此问题提交了错误报告,Bug #4150051


您可以将 ?: 称为 elvis 运算符/三元运算符/null coelscing。在 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中,没有问题。但是在 Adob​​e ColdFusion 中,我遇到了错误。请参阅附上的测试结果的屏幕截图。 1. 您可以看到转储在第一个规范中未定义。

  1. 在第二个规范中,如果你在 expect 中给出 elvis 运算符,expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1); 它给出实际的未定义

  2. 在第三个规范中,我试图使用临时变量来解决规范 2 中的 actual undefined 问题 itemTypeConfig = {}; var actualResult = itemTypeConfig.someConfig ?: "I am null"; expect( actualResult ).toBe(1); 但它给出的 actualResult is undefined

  3. 在第四个规范中,我在 BDD 测试套件中使用了 struckkeyexists 而没有使用这个三元运算符并且它工作正常。

我试图在独立的 cfm 文件中创建类似的行为,但我无法重现它。我不确定,无论是测试箱中的问题还是可能是 ACF 在闭包内处理 elvis 运算符。我不确定描述此问题的确切术语

这是 Adob​​e ColdFusion Release 2016 中的一个解析错误。(它适用于 ColdFusion 11)。我将您的示例缩减为演示该问题的代码。仅当您嵌套闭包调用至少 2 层时才会发生。

clos = function( func ) { func(); };

clos( function(){
    clos( function(){
        writeDump( foo ?: "I am null" );
    } );
} );

正如您报告的那样,输出是“未定义”,但预期是“我为空”。

请到Adobe Bug base买票。在修复之前,您将无法在 BDD 测试中使用 elvis 运算符。

我建议简化您的问题以使用这个更小的重现案例。