3

更新:为此问题提交了错误报告,错误 #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. 在第二个规范中,如果你在期望中给出 elvis 运算符,expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);它给出的是实际的未定义

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

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

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

4

1 回答 1

7

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

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

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

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

请前往Adob​​e Bug 基地并提交一张票。在修复之前,您将无法在 BDD 测试中使用 elvis 运算符。

我建议简化您的问题以使用这个小得多的复制案例。

于 2016-05-06T17:20:04.770 回答