使类可测试

本文关键字:测试 | 更新日期: 2023-09-27 17:52:46

我有一个叫做User的类。它有一个internal构造函数。我想创建一个User对象,所以我可以像这样模拟它:

public ISessionManagerInstance MockedSessionManager()
{
    var manager = new Mock<ISessionManagerInstance>();
    var company = new Chatham.Web.Business.Classes.Company(500, "", "", Enumerations.WebRelationshipInfo.NotSet, "", 0, 0, Data.Login.TeamOwnership.NotSet, 0, 0, false, null, false);
    manager.Setup(p => p.Company).Returns(company);
    Chatham.Web.Business.Classes.User displayUser = typeof(Chatham.Web.Business.Classes.User);
    displayUser.EntityID = 1786;
    manager.Setup(p => p.DisplayUser).Returns(displayUser);
    return manager.Object;
}

现在,Company有一个构造函数,所以这很容易。但User只有一个内部的。我是否可以创建一个User,并在其上设置一个int属性,以便我可以将该对象传递回模拟?

使类可测试

我能想到两种可能性:

创建一个IUser接口,让User实现它并针对它创建模拟。这是。net测试领域中非常常见的做法。所有使用Users的方法现在都很可能需要接受IUser引用。

另一种可能性(我不推荐,但有)是使用InternalsVisibleTo程序集属性。然后,可以从测试程序集中看到生产程序集的内部。

一种选择是将单元测试项目添加为主项目的"内部",这允许您的单元测试代码访问标记为"内部"的东西,而不允许其他人这样做。在AssemblyInfo.cs文件中实现它很简单:

// main project AssemblyInfo.cs file 
[assembly: InternalsVisibleTo("YourProject.Tests")]

你可以在你的AssemblyInfo.cs中使用InternalsVisibleTo属性来使内部成员对你的UnitTest程序集可见