2016-05-03 21 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 –