2016-06-15 103 views
-1

我應該怎麼做或者我應該如何聲明MyClass的這個斷言是真的大廈C#類

Assert.AreSame(typeof(MyClass).GetMethod("ToString").DeclaringType, typeof(MyClass)) 
+1

這是你實際需要測試的東西嗎? – Sean

+0

你想在這裏測試什麼? –

+0

只需重寫'MyClass'中的'ToString'?這裏真正的問題是什麼?你嘗試過什麼嗎?它有用嗎? –

回答

2

你將不得不重寫你的MyClass的聲明ToString方法。

class MyClass 
{ 
    public override string ToString() 
    { 
     return "MyClass"; 
    } 
} 

闡釋:

原因重寫的ToString允許通過斷言是因爲斷言確定在其中ToString方法被聲明的類型(這是默認System.Object的)。通過重寫該方法,您可以在MyClass中重新聲明ToString方法。

替代

而是覆蓋,你可以使用new關鍵字。這將重新聲明一個方法而不會覆蓋它。不同之處在於,當一個實例MyClass被轉換爲object時,調用ToString就不會調用您的用new關鍵字修飾的方法,但會在使用關鍵字override進行修飾時調用。

class MyClass 
{ 
    public new string ToString() 
    { 
     return "MyClass"; 
    } 
} 
+0

測試通過使用覆蓋,是否有任何其他方式比覆蓋 – ngoni

+0

@ngoni我添加了一個替代方案。 – Wazner

1

在這個測試中,你是triyng來獲取ToString()的DeclaringType。但是您的類沒有聲明「ToString」,因此DeclaringType將始終返回「object」(基類聲明瞭ToString())

避免這種情況的一種方法是使用ReflectedType屬性而不是DeclaringType。

Assert.AreSame(typeof(MyClass).GetMethod("ToString").ReflectedType,typeof(MyClass); 

如果你聲明「MyClass的」這樣一來,覆蓋toString()方法,並使用原測試,使用DeclaringType屬性,你會得到相同的結果!

class MyClass 
{ 
    public override string ToString() 
    { 
     return "Foo"; 
    } 
} 

希望它有幫助!