我有一个有一个公共方法的程序集。我想为这种方法编写单元测试。 要创建此类的实例,将调用默认构造函数。我无法改变这一点。 所有这个方法都是检查传递给方法的对象,并根据值更新数据库中的表。 对于单元测试,我想验证是否已进行db调用。 我想模拟数据库。这样做的最佳方式是什么? 到目前为止,我已经添加了一个IRepository类型的属性。 在该方法中,如果这是null,我创建一个Repository的实例。我的想法是,在单元测试中,我将此属性设置为Mocked Repository。听起来不错吗?
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);
}
答案 0 :(得分: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属性设置为上面的mock类的版本,而不是传递您的实际实现。然后,您可以查看模拟类,以确定您的类是否正确调用了UpdateTable。听起来这就是你计划做的事情,所以回答你的问题;是的 - 听起来不错。
使用自己的模拟类(他们在一段时间后开始构建)的另一种方法是使用模拟框架,例如NSubstitute或Moq,它更像是学习曲线,但从长远来看更快。