它看起來好像你試圖包裝第三方/系統對象,以幫助單元測試。
告訴別人,你的出發點是
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