2016-05-03 19 views
3

更新:提交bug报告针对此问题,Bug #4150051Adob​​e ColdFusion,请2016 TESTBOX BDD猫王操作问题


你可以称之为:如猫王运营商/三元运算/空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中,我遇到了错误。请参阅测试结果的屏幕截图。 enter image description here 1.您可以看到转储在第一个规格中未定义。

  • 在第二天赋,如果你给猫王运营商内部的期望,expect(itemTypeConfig.someConfig ?: "I am null").toBe(1);这是给实际的不确定

  • 在第三个规格,我想使用临时变量作为变通方法来解决实际未定义问题规范2 itemTypeConfig = {}; var actualResult = itemTypeConfig.someConfig ?: "I am null"; expect(actualResult).toBe(1); 但它给actualResult是不确定的

  • 在第四规范,我使用同列struckkeyexists使用这个三元运算符BDD测试套件&它工作正常。

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

    +0

    如果在每个'itemTypeConfig'定义之前尝试添加'var'会怎么样?像这样:'var itemTypeConfig = {};'。 – Pankaj

    +0

    即使var与这个上下文无关,我也已经尝试过了。非常感谢您的建议 –

    +2

    您是否可以将它缩减为单独一行代码(或者可能是3或4),以单独显示问题?我认为这个问题只是有很多代码和解释,所以它会被剔除,因为需要花费大量的时间来挖掘和理解这一切。 –

    回答

    5

    这是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操作员。

    我会建议简化你的问题,使用这个更小的repro案例。

    +0

    非常感谢您的简化示例,以模仿我的问题&正如您已经提到过这个示例和我的测试套件在CF 11中工作正常,但在2016年不在CF中,我将在Adobe bug基地 –

    +0

    中记录一个bug添加了错误https:/ /bugbase.adobe.com/index.cfm?event=bug&id=4150051 –