单元测试和模拟数据库

时间:2016-05-19 12:27:28

标签: c# unit-testing mocking

我有一个有一个公共方法的程序集。我想为这种方法编写单元测试。 要创建此类的实例,将调用默认构造函数。我无法改变这一点。 所有这个方法都是检查传递给方法的对象,并根据值更新数据库中的表。 对于单元测试,我想验证是否已进行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);
}

1 个答案:

答案 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,它更像是学习曲线,但从长远来看更快。