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中,没有问题。但是在 Adobe ColdFusion 中,我遇到了错误。请参阅附上的测试结果的屏幕截图。
1. 您可以看到转储在第一个规范中未定义。
在第二个规范中,如果你在 expect 中给出 elvis 运算符,expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);
它给出实际的未定义
在第三个规范中,我试图使用临时变量来解决规范 2 中的 actual undefined 问题
itemTypeConfig = {};
var actualResult = itemTypeConfig.someConfig ?: "I am null";
expect( actualResult ).toBe(1);
但它给出的 actualResult is undefined
在第四个规范中,我在 BDD 测试套件中使用了 struckkeyexists 而没有使用这个三元运算符并且它工作正常。
我试图在独立的 cfm 文件中创建类似的行为,但我无法重现它。我不确定,无论是测试箱中的问题还是可能是 ACF 在闭包内处理 elvis 运算符。我不确定描述此问题的确切术语
这是 Adobe ColdFusion Release 2016 中的一个解析错误。(它适用于 ColdFusion 11)。我将您的示例缩减为演示该问题的代码。仅当您嵌套闭包调用至少 2 层时才会发生。
clos = function( func ) { func(); };
clos( function(){
clos( function(){
writeDump( foo ?: "I am null" );
} );
} );
正如您报告的那样,输出是“未定义”,但预期是“我为空”。
请到Adobe Bug base买票。在修复之前,您将无法在 BDD 测试中使用 elvis 运算符。
我建议简化您的问题以使用这个更小的重现案例。
更新:针对此问题提交了错误报告,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中,没有问题。但是在 Adobe ColdFusion 中,我遇到了错误。请参阅附上的测试结果的屏幕截图。
在第二个规范中,如果你在 expect 中给出 elvis 运算符,
expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);
它给出实际的未定义在第三个规范中,我试图使用临时变量来解决规范 2 中的 actual undefined 问题
itemTypeConfig = {}; var actualResult = itemTypeConfig.someConfig ?: "I am null"; expect( actualResult ).toBe(1);
但它给出的 actualResult is undefined在第四个规范中,我在 BDD 测试套件中使用了 struckkeyexists 而没有使用这个三元运算符并且它工作正常。
我试图在独立的 cfm 文件中创建类似的行为,但我无法重现它。我不确定,无论是测试箱中的问题还是可能是 ACF 在闭包内处理 elvis 运算符。我不确定描述此问题的确切术语
这是 Adobe ColdFusion Release 2016 中的一个解析错误。(它适用于 ColdFusion 11)。我将您的示例缩减为演示该问题的代码。仅当您嵌套闭包调用至少 2 层时才会发生。
clos = function( func ) { func(); };
clos( function(){
clos( function(){
writeDump( foo ?: "I am null" );
} );
} );
正如您报告的那样,输出是“未定义”,但预期是“我为空”。
请到Adobe Bug base买票。在修复之前,您将无法在 BDD 测试中使用 elvis 运算符。
我建议简化您的问题以使用这个更小的重现案例。