使课程可测试

sla*_*dau 4 .net c# unit-testing mocking internal

所以我有一个叫做的课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;
}
Run Code Online (Sandbox Code Playgroud)

现在,Company有一个构造函数,这很容易.但User有一个只是内部的.有什么办法我可以创建一个Userint在其上设置一个属性,以便我可以将该对象传回模拟器上吗?

Nat*_*ate 6

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

// main project AssemblyInfo.cs file 
[assembly: InternalsVisibleTo("YourProject.Tests")]
Run Code Online (Sandbox Code Playgroud)


Mat*_*eer 6

我可以想到两种可能性:

创建一个IUser接口,让User实现它并为它创建模拟.这是.NET测试领域的一种非常常见的做法.您使用用户的所有方法很可能现在都需要接受IUser引用.

另一种可能性(我不建议,但它就在那里)是使用InternalsVisibleTo程序集属性.然后,可以从测试装配中看到生产装配的内部结构.