如何单元测试将记录插入RIA Services DB的功能?

时间:2009-10-13 18:52:43

标签: c# silverlight unit-testing entity-framework wcf-ria-services

这是一个与实体一起使用的示例函数,将其保存到数据库然后导致问题,因为我们无法为它编写单元测试。看看:

// this class exists in a Silverlight Class Library
public class EmployeeSaver
{
    ....

    public void Go()
    {
        Employee e = new Employee();

        e.Name="Jeremiah";

        ... // Other stuff that really needs to be tested

        _DataContext.Employees.Add(e);
        _DataContext.SubmitChanges();

    }
}

由于RIA Services的性质,DomainService不在Silverlight Unit Testing框架内运行。这意味着我在进行单元测试时无法访问RIA。

我们考虑过模拟数据库,但这个类实际上创建了一个要添加到数据库的实体(Employee)。这是有问题的,因为模拟数据库不使用此实体,而是使用看起来类似于原始实体的MockEntity类。

我们不是试图测试RIA本身,而是我们如何使用RIA生成的实体。

我的最终目标是编写一个类似于此的函数:

[TestMethod]
public void Test()
{
    EmployeeSaver s = new EmployeeSaver();
    s.Go();

    Assert.IsEqual( DataContext.Employees.Last().Name, "Jeremiah" );
}

如何测试此功能?我应该使用什么测试框架?我是否可以使用Silverlight测试框架?

2 个答案:

答案 0 :(得分:2)

在单元测试中,实例需要有一个_DataContext的存根实现。当调用Go方法时,它调用:         _DataContext.Employees.Add(E);         _DataContext.SubmitChanges(); 它会调用你的存根。然后,存根应记录员工已添加并提交更改的事实。

在调用Go之后,您应该查询存根以确保添加了新员工,并且发生了对SubmitChanges的调用。

作为次要说明: 我真的不同意另一个答案的最后一部分,因为你不应该关心Go是否调用_DataContext的各种方法。确实,你不关心在这里测试_DataContext方法,但Go的单元测试需要确保Go方法正确调用_DataContext方法。理由是Go方法的每一行都应该是可测试的。如果你没有做这个验证,那么你可以删除对_DataContext方法的调用,破坏代码,但单元测试不会捕获它。这将打破鲍勃·马丁的“TDD三条规则”原则。

答案 1 :(得分:1)

手动模拟数据库可以按原样存储您的对象。我们使用这样一个系统,其中存储库存储在字典中。

你甚至不需要那么远。您可以使用类似于RhinoMocks的_DataContext的模拟接口来确保您希望调用的方法是(它不是您对此测试的关注_DataContext.SubmitChanges()的工作原理(这将是它的单元测试)你只关心Go设置对象并调用save。