如何强制类型转换接口的具体类型
我想嘲笑ManagementObjectSearcher
类并创建了一个IManagementInfo
接口,所以,我怎么能投界面到ManagementObjectSearcher
类?如何强制类型转换接口的具体类型
ManagementObjectSearcher s = new ManagementObjectSearcher();
IManagementInfo info = s as IManagementInfo;
这造成了我一个空信息对象
ManagementObjectSearcher s = new ManagementObjectSearcher();
IManagementInfo info =IManagementInfo(s);
这给了我运行时错误(不能强制转换)
你不能做到这一点。你想这样做,以便你可以编写单元测试?如果你想模拟一个你无法控制的类,那么你必须将它包装在另一个类中。
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
界面创建您的模拟。
所以现在调用ManagementObjectSearcher在YourCode(IManagementInfoinfo) – Nisha
其对我来说很有意义,努力实现上面说过,感谢输入:) – Nisha
没问题!如果这解决了您的问题,请将其标记为正确的解决方案。 – user707727
它看起来好像你试图包装第三方/系统对象,以帮助单元测试。
告诉别人,你的出发点是
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());
}
代码??我没有它可以帮助你吗? – Freelancer
'ManagementObjectSearcher'是否实现'IManagementInfo'接口? –
@JamesB:不,它不。它的.net类 – Nisha