所以我有一个名为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
属性,以便我可以将该对象传回模拟器上?
答案 0 :(得分:6)
一种选择是将您的单元测试项目添加为主项目的“内部”,这允许您的单元测试代码访问标记为“内部”的内容,而不允许其他人这样做。在AssemblyInfo.cs文件中实现它很简单:
// main project AssemblyInfo.cs file
[assembly: InternalsVisibleTo("YourProject.Tests")]
答案 1 :(得分:6)
我可以想到两种可能性:
创建一个IUser
接口,让User实现它并为其创建模拟。这是.NET测试领域的一种非常常见的做法。您使用用户的所有方法很可能现在需要接受IUser
引用。
另一种可能性(我不推荐,但它就在那里)是使用InternalsVisibleTo程序集属性。然后,可以从测试装配中看到生产装配的内部结构。
答案 2 :(得分:2)
您可以使用AssemblyInfo.cs中的InternalsVisibleTo属性使内部成员对UnitTest程序集可见。