簡體   English   中英

使用內部構造函數對類進行單元測試

[英]Unit Testing a class with an internal constructor

我有一個名為“Session”的類,它公開了幾個公共方法。 我想對這些進行單元測試,但是在生產中我需要控制“Session”對象的實例化,因此將構造委托給 SessionManager 類並使 Session 的構造函數成為內部。

理想情況下,我想測試 Session 類與創建它/它們的 SessionManager 隔離,以證明 Session 公開的公共接口按預期工作 - 但不能在不使用 SessionManager 的情況下從測試中實例化 Session 使我的測試比他們需要的更復雜/更沒用。

處理這個問題的最佳方法是什么?

干杯,

萊尼。

沒有什么可以阻止您測試內部結構。 通過使用 InternalsVisibleTo 屬性,簡單地使您的代碼的內部結構對測試套件可見:在 AssemblyInfo 中,添加

[assembly:InternalsVisibleTo("TestSuiteAssembly")]

您可以讓您的單元測試類從 Session 繼承(假設您的測試框架不需要您從特定類繼承)。 例如,使用 NUnit :

[TestFixture]
public class SessionTest : Session
{
    public SessionTest()
        : base() // call protected constructor
    {
    }

    [Test]
    public void TestSomething()
    {
    }

}

或者,作為一種解決方法,您可以創建一個繼承自 Session 並公開公共構造函數的 TestSession。 在您的單元測試中,您然后使用 TestSession,它基本上與原始 Session 對象相同。

public class TestSession : Session
{

   public TestSession() : base()
   {

   }

}

您想使用像TypeMock這樣的產品,它允許您創建類的模擬(偽造)實例,如下所示:

var myInstance = Isolate.Fake.Instance<Session>();
// mock behavior here
// do assertions here

為了記錄,您也可以使用 TypeMock 創建抽象類的實例。

我會質疑將會話類構造函數設置為內部的價值。

通常,這意味着您試圖阻止其他開發人員使用您的類。 也許最好傳達一下應用程序的這個特定部分是如何工作的,以及為什么您只想從會話管理器訪問會話?

如果您可以使用“受保護的內部”構造函數,那么,假設您的測試在不同的程序集中,您可以將 InternalsVisibleTo 屬性添加到您的“待測試程序集”。 這將允許您的測試看到待測試程序集的內部成員”。

更新出於某種原因,我讀到您的構造函數受到保護。 它已經是內部的,因此您可以很好地使用該屬性。

對於.Net Core您可以修改.csproj

...
<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
        <_Parameter1>$(AssemblyName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
...

它將使您的測試項目的內部內容可見。

暫無
暫無

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

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