//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"}
});
对于一般的模拟和单元测试不熟悉,我有几个问题:
我可以选择在我的方案中删除Person类吗?
在这种情况下嘲笑有什么好处?我阅读,阅读和阅读,但我似乎无法理解为什么我看到这样的例子,测试存储库。当我必须对业务逻辑进行单元测试时,模拟对我有意义,但在数据层中却没有那么多。有什么智慧的话要为我清楚这一点?
感谢。
答案 0 :(得分:4)
1)您可以在包含存储库类的程序集(在AssemblyInfo.cs中)use the "InternalsVisibleTo" attribute,以授予Moq程序集访问它的权限。
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("YourTestClass")]
2)模拟将数据层与单元测试的依赖性要求分离。
以这种方式思考:你不会创建一个Mock来测试存储库本身。您正在为其他类创建模拟以用作伪数据源,以测试其需要来自实际应用程序中的存储库的输入数据的功能。
如果您可以准确预测存储库将提供的数据案例,那么您可以将这些案例模拟为虚假输入,而不要求您的单元测试实际连接到数据库以获取实时数据。
你的例子实际上不会对存储库中的任何东西进行单元测试(除了无参数构造函数!)所以......我不知道你在哪里看到这些例子,但我不觉得上面的代码提供任何有用的“按原样”。