【问题标题】:Can you mock/stub an internal property?你可以模拟/存根内部属性吗?
【发布时间】:2011-07-11 20:39:36
【问题描述】:
//class = Person
public string Name { get; internal set; }

我有一个对象,上面声明了几个不同的字段。我想使用最小起订量,这样我就可以对存储库进行单元测试。存储库只返回一个名称列表,所以我想设置 Moq 以像这样使用它:

var personRepositoryMock = new Mock<IPersonRepository>();

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

一般来说,作为模拟和单元测试的新手,我有几个问题:

  1. 在我的场景中,我有哪些选项可以删除 Person 类?

  2. 在这种情况下模拟有什么好处?我读了又读,但我似乎无法理解为什么我会看到这样的示例,测试存储库。当我必须对业务逻辑进行单元测试时,模拟对我来说很有意义,但在数据层中却没有那么多。有什么智慧的话可以为我解决这个问题吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这样想:您不会创建一个 Mock 来测试存储库本身。您正在为其他类创建模拟以用作假数据源,以测试它们需要来自真实应用程序中的存储库的输入数据的功能。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多