2016-05-19 116 views
1

我有一个程序集有一个公共方法。我想为这种方法写一个单元测试。 要创建此类的实例,将调用默认的构造函数。我无法改变这一点。 所有此方法都会检查传入该方法的对象,并根据值更新数据库中的表。 对于单元测试,我想验证数据库调用已经完成。 我想嘲笑数据库。这样做的最好方法是什么? 到目前为止,我已经添加了一个IRepository类型的属性。 在该方法中,如果这是空的,我创建一个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

测试数据库是一个集成测试,而不是单元测试。但是,如果你嘲笑数据库,那么你一点都没有测试,这是毫无意义的。除非你在Process()中有业务逻辑,否则我不打扰。 – Crowcoder

+0

有一些商业逻辑..在取决于对象的上下文的值不同的表在数据库中更新。 – Fiona

+1

您声明您的目标是验证数据库调用是否已完成,但您将如何通过模拟来做到这一点?如果您正在测试独立于数据访问的业务逻辑,那么模拟数据是绝对合适的。你可能需要设置依赖注入(用于交换界面),或者你需要将你的数据访问分割成一个新的虚拟方法,可以用[Moq](https://github.com/Moq)/moq4 /维基/快速开始)。 – Crowcoder

回答

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等模拟框架,它更像是一个学习曲线,但是从长远来看更快。

+0

谢谢Mark_h。我用Moq来嘲笑这个版本。只是想知道我在正确的轨道上。再次感谢 – Fiona