簡體   English   中英

替換“密封”類的實現

[英]Replace implementation of a “sealed” class

A是來自引用的dll的類,因此無法更改。 它有一個方法Foo() ,該方法在我的DoFoo()方法內部被調用(以A作為參數)。 我想在不執行Foo() DoFoo()情況下測試DoFoo() ,因為它很昂貴並且已經過測試。

在這種情況下,最佳做法是什么?

我對此的想法:

  • A周圍創建包裝器類,並將其傳遞到DoFoo() 包裝器類區分真實的和假的實現。
  • 使用擴展方法也可以做到這一點。
  • 使用dynamic並通過一個空的DoFoo()實現傳遞一個偽類。

創建一個包含要公開的方法的接口。

創建一個實現該接口並使用外部程序集的類完成其工作的包裝器類。 您可以創建此接口的其他實現,例如模擬實現。

例如,將帶有構造函數注入的接口注入需要功能的類中。

在測試中,您可以輕松地將使用外部庫的實現替換為模擬實現。

實際上,使用Typemock做到這一點非常容易,您無需使用包裝器或創建接口,只需對其進行模擬即可。 例如:

被測方法:

public string DoFoo(A a)
    {
        string result = a.Foo();
        return result;
    }
}

sealed public class A
{
    public string Foo()
    {
        throw new NotImplementedException();
    }
}

測試:

[TestMethod,Isolated]
public void TestMethod1()
{
    var a = Isolate.Fake.Instance<A>(Members.CallOriginal);

    Isolate.WhenCalled(() => a.Foo()).WillReturn("TestWorked");

    var classUnderTest = new Class1();
    var result = classUnderTest.DoFoo(a);

    Assert.AreEqual("TestWorked", result);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM