2013-04-12 146 views
1

我想嘲笑ManagementObjectSearcher類並創建了一個IManagementInfo接口,所以,我怎麼能投界面到ManagementObjectSearcher類?如何強制類型轉換接口的具體類型

ManagementObjectSearcher s = new ManagementObjectSearcher(); 
IManagementInfo info = s as IManagementInfo; 

這造成了我一個空信息對象

ManagementObjectSearcher s = new ManagementObjectSearcher(); 
IManagementInfo info =IManagementInfo(s); 

這給了我運行時錯誤(不能強制轉換)

+2

代碼??我沒有它可以幫助你嗎? – Freelancer

+0

'ManagementObjectSearcher'是否實現'IManagementInfo'接口? –

+0

@JamesB:不,它不。它的.net類 – Nisha

回答

4

你不能做到這一點。你想這樣做,以便你可以編寫單元測試?如果你想模擬一個你無法控制的類,那麼你必須將它包裝在另一個類中。

public class MyManagementObjectSearcherWrapper : IManagementInfo 
{ 
    public void TheMethodToMock() 
    { 
     var searcher = new ManagementObjectSearcher();   
     // The code you want to mock goes here 
    } 
} 

你運行你的代碼是這樣的:

public void YourCode(IManagementInfo info) 
{ 
    info.TheMethodToMock(); 
} 

然後YourCode()將採取或者您的包裹件或嘲笑的對象。您使用IManagementInfo界面創建您的模擬。

+0

所以現在調用ManagementObjectSearcher在YourCode(IManagementInfoinfo) – Nisha

+0

其對我來說很有意義,努力實現上面說過,感謝輸入:) – Nisha

+0

沒問題!如果這解決了您的問題,請將其標記爲正確的解決方案。 – user707727

0

它看起來好像你試圖包裝第三方/系統對象,以幫助單元測試。

告訴別人,你的出發點是

public class Dependency { 

    public string Foo() { 
     return "foo"; // machine, system, time, something else, dependent result 
    } 

    public string Bar() { 
     return "bar"; 
    } 
} 

public class MySimpleClass { 

    public string MyFunc() { 
     return new Dependency().Foo(); 
    } 

} 

[TestMethod] 
public void TestSimple() { 

    var client = new MySimpleClass(); 

    Assert.AreEqual("foo", client.MyFunc()); 

} 

我們正在創建的依賴裏面調用,因爲我們正在考慮創建成本比舉行對相關的實例更重要。這將取決於情況。我們可以輕鬆地在ctor中創建一個依賴項,並存儲我們每次調用的副本。無論如何,我們無法控制導致單元測試混亂的輸出。

我們需要爲它創建一個代理。

1.定義,我們需要
最有可能的,我們並不需要使用所有的wrappee成員成員的接口,因此僅包括那些這是我們關心的接口。

public interface IDependencyProxy { 
    string Foo(); 
} 

2.創建一個代理類
然後創建一個代理類包裝的依賴和實現接口。再次,我們可以在開始或通過呼叫的基礎上創建。

public class DependencyProxy : IDependencyProxy { 

    public string Foo() { 
     return new Dependency.Foo(); 
    } 

} 

3.定義我們的客戶端代碼的接口
方面,我們修改我們的客戶端代碼稍微使用IDependencyProxy接口,而不是依賴。有幾種方法可以做到這一點。我通常使用一個內部的ctor,它從公共ctor中鏈接依賴項。 (使用[InternalsVisibleTo]允許單元測試,看看它)

public class MyRevisedClass { 

    private readonly IDependencyProxy dependency; 

    public MyRevisedClass() 
     : this(new DependencyProxy()) {} 

    internal MyRevisedClass(IDependencyProxy dependency) { 
     this.dependency = dependency; 
    } 

    public string MyFunc() { 
     return dependency.Foo(); 
    } 

} 

這使得我們的生產代碼默認行爲(調用系統對象),使我們能夠模擬出了單元測試的結果。

[TestMethod] 
public void TestRevisedDefault() { 

    var client = new MyRevisedClass(); 
    Assert.AreEqual("foo", client.MyFunc()); 

} 


[TestMethod] 
public void TestRevisedWithMockedDependency() { 

    var dep = new Mock<IDependencyProxy>(); 
    dep.Setup(mk => mk.Foo()).Returns("bar"); 
    var client = new MyRevisedClass(dep.Object); 

    Assert.AreEqual("bar", client.MyFunc()); 

} 
相關問題