[英]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()
{
}
}
我會質疑將會話類構造函數設置為內部的價值。
通常,這意味着您試圖阻止其他開發人員使用您的類。 也許最好傳達一下應用程序的這個特定部分是如何工作的,以及為什么您只想從會話管理器訪問會話?
如果您可以使用“受保護的內部”構造函數,那么,假設您的測試在不同的程序集中,您可以將 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.