2010-05-15 78 views
1

我在FlexUnit中需要它來測試私有方法。有沒有可能通過使用describeType進行反射來完成此操作,或者flexUnit是否有一些內置的工具?我不喜歡人爲限制,我無法測試私人功能,它大大降低了靈活性。是的,對我來說測試私有函數是一個很好的設計,所以請不要建議我重構我的代碼。爲了單元測試我不想打破封裝。在Flex中調用私有方法,Actionscript

回答

6

我99%肯定這是不可能的,我很想知道你爲什麼要這樣做。

您應該基於給定的輸入,對給定類的輸出進行單元測試,而不管類內發生了什麼。只要不改變預期的輸出(由單元測試定義),您確實希望允許某人能夠更改實現細節。

如果您測試私有方法,則對該類的任何更改都將與單元測試緊密結合。如果有人想重新編寫代碼以提高可讀性,或者進行一些更新以提高性能,那麼即使類仍然按照最初設計的那樣運行,他們將不得不更新單元測試。

我敢肯定,有些情況下測試私有方法可能是有益的,但我希望在大多數情況下它只是不需要。你不必破壞封裝,只是測試你的方法調用給出正確的輸出......不管內部代碼是什麼。

1

您不能使用describeType

Livedocs - flash.utils package

[...]

注:describeType()只顯示公共屬性和方法,而不會顯示 屬性和方法私有,在包內部或在自定義名稱空間中。

[...]

2

只需創建一個名爲「單元測試」的公共方法,並調用該方法內的所有單元測試。拋出一個錯誤,當其中一個出現故障,並從你的測試框架稱之爲:

try { 
    myobject.unitTest(); 
} catch (Exception e) { 
    //etc. 
} 
0

當測試的私有方法的衝動是無法抗拒的我只創建一個可測試命名的方法。

在這樣的文件中聲明命名空間:

package be.xeno.namespaces 
{ 
    public namespace testable = "http://www.xeno.be/2015/testable"; 
} 

然後你就可以使用可測試爲你想測試這樣的方法自定義訪問修飾符:

public class Thing1 
{ 
    use namespace testable; 

    public function Thing1() 
    { 
    } 

    testable function testMe() : void 
    { 

    } 
} 

你可以然後通過在測試中使用命名空間訪問該修飾符:

public class Thing2 
{ 
    use namespace testable; 

    public function Thing2() 
    { 
     var otherThing : Thing1 = new Thing1(); 
     otherThing.testMe(); 
    } 
} 

真的,雖然我t這意味着你應該將你的功能分解成一個單獨的類。