你能模拟/存根内部财产吗?

时间:2011-07-11 20:39:37

标签: asp.net-mvc unit-testing mocking moq

//class = Person
public string Name { get; internal set; }

我有一个具有几个不同字段的对象,如上所示声明。我想使用Moq,所以我可以对存储库进行单元测试。存储库只返回一个名称列表,所以我想设置Moq来使用它,如下所示:

var personRepositoryMock = new Mock<IPersonRepository>();

personRepositoryMock
        .Setup(p => p.GetNames())
        .Returns(new List<Person>
        {
            new Person{Name = "Hulk Hogan"}
        });

对于一般的模拟和单元测试不熟悉,我有几个问题:

  1. 我可以选择在我的方案中删除Person类吗?

  2. 在这种情况下嘲笑有什么好处?我阅读,阅读和阅读,但我似乎无法理解为什么我看到这样的例子,测试存储库。当我必须对业务逻辑进行单元测试时,模拟对我有意义,但在数据层中却没有那么多。有什么智慧的话要为我清楚这一点?

  3. 感谢。

1 个答案:

答案 0 :(得分:4)

1)您可以在包含存储库类的程序集(在AssemblyInfo.cs中)use the "InternalsVisibleTo" attribute,以授予Moq程序集访问它的权限。

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("YourTestClass")]

2)模拟将数据层与单元测试的依赖性要求分离。

以这种方式思考:你不会创建一个Mock来测试存储库本身。您正在为其他类创建模拟以用作伪数据源,以测试其需要来自实际应用程序中的存储库的输入数据的功能。

如果您可以准确预测存储库将提供的数据案例,那么您可以将这些案例模拟为虚假输入,而不要求您的单元测试实际连接到数据库以获取实时数据。

你的例子实际上不会对存储库中的任何东西进行单元测试(除了无参数构造函数!)所以......我不知道你在哪里看到这些例子,但我不觉得上面的代码提供任何有用的“按原样”。