更新:为此问题提交了错误报告,错误 #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. 您可以看到转储在第一个规范中未定义。
在第二个规范中,如果你在期望中给出 elvis 运算符,
expect( itemTypeConfig.someConfig ?: "I am null" ).toBe(1);
它给出的是实际的未定义在第三个规范中,我试图使用临时变量来解决规范 2 中实际未定义
itemTypeConfig = {}; var actualResult = itemTypeConfig.someConfig ?: "I am null"; expect( actualResult ).toBe(1);
的问题, 但它给出的实际结果是未定义的在第四个规范中,我在 BDD 测试套件中使用了strikekeyexists,而没有使用这个三元运算符,它工作正常。
我试图在独立的 cfm 文件中创建类似的行为,但我无法重现它。我不确定是测试箱中的问题还是可能是 ACF 在闭包内处理 elvis 运算符。我不确定描述此问题的确切术语