2013-10-03 47 views
2

我想用屬性來裝飾一個測試方法。這個屬性應該知道什麼測試被認爲是關於屬性方法的先前測試。下面是一個exampel:如何使用屬性作爲表達式傳遞方法?

private void DestinationChoiceViewLoaded_AllTpmFeaturesAreEnabled_UIElementsAreSetUpProperly() { 
     var vut = new DestinationChoiceViewUIWrapper(); 

     UIControlAssert.Clickable(vut.GetNextPageButton()); 
     UIControlAssert.Clickable(vut.GetPreviousPageButton()); 
    } 

    [PreviousTestInOrder()] 
    public void Run_DestinationChoiceView_Tests() { 

     var vut = new DestinationChoiceViewUIWrapper(); 

     UIControlAssert.Clickable(vut.GetNextPageButton()); 
     UIControlAssert.Clickable(vut.GetPreviousPageButton()); 
    } 

不知怎的,我想在DestinationChoiceViewLoaded_AllTpmFeaturesAreEnabled_UIElementsAreSetUpProperly傳遞給屬性構造。

我想:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
public class PreviousTestInOrderAttribute : Attribute 
{ 
    public string MethodName { get; private set; } 

    public PreviousTestInOrderAttribute(Expression<Action> memberExpression) { 
     MethodName = GetMemberName(memberExpression); 
    } 

    public static string GetMemberName(Expression<Action> memberExpression) { 
     MemberExpression expressionBody = (MemberExpression) memberExpression.Body; 
     return expressionBody.Member.Name; 
    } 
} 

但如果我這樣做

[PreviousTestInOrder(() => DestinationChoiceViewLoaded_AllTpmFeaturesAreEnabled_UIElementsAreSetUpProperly)] 

它不會編譯:(

+0

您可以將方法名稱作爲字符串傳遞並使用反射來解決它,或者爲什麼不只是有一個TestOrder(int order)屬性來測試應該運行的順序呢? –

+0

如果有人想在測試序列中插入一個測試,你該怎麼辦? – EngineerSpock

+0

對命令使用double而不是int,這樣你就可以在無需更改其他任何地方的情況下將事物插入到序列中,而無需更改其他人 –

回答

3

你不能這樣做,不幸的是,屬性參數必須是編譯時間常量

我想唯一的選擇是在當前執行之前實際調用之前的測試(該測試的第一行)。

相關問題