4

所以我有一个名为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属性,以便我可以将该对象传回模拟?

4

3 回答 3

6

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

// main project AssemblyInfo.cs file 
[assembly: InternalsVisibleTo("YourProject.Tests")]
于 2011-04-25T20:23:55.040 回答
6

我能想到两种可能:

创建一个IUser接口,让用户实现它并针对它创建模拟。这是 .NET 测试领域中非常普遍的做法。您所有使用用户的方法现在很可能需要接受IUser引用。

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

于 2011-04-25T20:24:20.037 回答
2

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

于 2011-04-25T20:22:51.097 回答