【发布时间】: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