2013-04-12 140 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()); 

} 
相关问题