【问题标题】:unit testing and mocking the db单元测试和模拟数据库
【发布时间】:2016-05-19 12:27:28
【问题描述】:

我有一个具有一个公共方法的程序集。我想为此方法编写一个单元测试。 要创建此类的实例,将调用默认构造函数。我无法改变这一点。 该方法所做的只是检查传递给该方法的对象,并根据值更新数据库中的表。 对于单元测试,我想验证是否进行了 db 调用。 我想模拟数据库。这样做的最佳方法是什么。 到目前为止,我已经添加了一个 IRepository 类型的属性。 在该方法中,如果 this 为 null,我将创建存储库的一个实例。我的想法是,在单元测试中,我会将此属性设置为模拟存储库。这听起来好吗?

public IRepository DatabaseInstance { get; set; }

public void Process(ObjectContext context)
{
    if (DatabaseInstance == null)
        DatabaseInstance = new UpdateRepository();
    // Depending on value in context, set up values of sprocToCall and listOfParameters

    //Eventually call UpdateTable
    DatabaseInstance.UpdateTable(sprocToCall, listOfParameters);
}

【问题讨论】:

  • 测试数据库是集成测试,而不是单元测试。但是,如果您模拟数据库,那么您根本就没有测试任何东西,这是没有意义的。除非您在 Process() 中有业务逻辑,否则我不会打扰。
  • 有一些业务逻辑..根据对象'context'的值不同的表在数据库中更新。
  • 您说您的目标是验证数据库调用是否已完成,但是您将如何使用模拟来做到这一点?如果您正在测试独立于数据访问的业务逻辑,那么模拟数据是绝对合适的。您要么需要设置依赖注入(用于换出接口),要么需要将数据访问拆分为一个新的虚拟方法,该方法可以使用 Moq 之类的东西进行模拟。
  • 所以 IRepository 有一个方法:UpdateTable(sprocToCall, listOfParameters)。如果我模拟存储库,我可以根据之前的业务逻辑验证是否使用正确的参数调用了此方法?
  • 我认为您必须在调用 UpdateTable 之前声明这些参数。如果不看大局,就很难给出一般性建议。

标签: c# unit-testing mocking


【解决方案1】:

看起来你已经差不多了。你只需要像这样的模拟类;

public interface IRepository
{
    void UpdateTable(string sprocToCall, List<string> listOfParameters);
}

public class MockRepository:IRepository
{
    public string SprocToCall { get; set; }
    public List<string> ListOfParameters { get; set; }
    public void UpdateTable(string sprocToCall, List<string> listOfParameters)
    {
        SprocToCall = sprocToCall;
        ListOfParameters = listOfParameters;
    }
}

我已经包含了我使用的界面,因为它可能与您的 IRepository 版本不同。

您可以将 IRepository 属性设置为上述模拟类的版本,而不是传递您的实际实现。然后,您将能够查看模拟类以确定您的类是否正确调用了 UpdateTable。听起来这就是您打算这样做以回答您的问题;是的 - 听起来不错。

使用您自己的模拟类(它们会在一段时间后开始构建)的替代方法是使用模拟框架,例如 NSubstitute 或 Moq,它更像是一个学习曲线,但从长远来看更快。

【讨论】:

  • 谢谢 Mark_h。我使用 Moq 来模拟存储库。只是想知道我在正确的轨道上。再次感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多