3

这是一个示例函数,它与一个实体一起工作,将其保存到一个数据库,然后导致问题,因为我们不能为它写一个单元测试。检查出来:我该如何测试一个将记录插入RIA服务数据库的函数?

// 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服务的性质,一个DomainService不运行在Silverlight单元测试框架内部。这意味着我在进行单元测试时无法访问RIA。

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

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

我的最终目标是写一个类似的功能:

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

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

如何测试这个功能呢?我应该使用什么测试框架?我是否使用Silverlight测试框架?

+0

艰难的一个...... :( – 2009-10-13 21:07:08

+0

测试多个层次是不容易的...模拟,测试单独或重新考虑? – 2009-10-14 08:58:16

回答

2

在你的单元测试中,实例s需要有一个_DataContext的存根实现,当Go方法被调用时,它调用: _DataContext.Employees。加入(E); _DataContext.SubmitChanges(); ,它会调用到您的存根然后存根应当记录该雇员得到了补充,并提交更改的事实

电话后去,你笑。 uld查询存根以确保新员工被添加,并且发生了对SubmitChanges的调用。

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

1

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

你甚至不需要那么远。您可以使用类似RhinoMocks的_DataContext的模拟接口来确保您期望被调用的方法(它不是您对此测试的关注,即_DataContext.SubmitChanges()起作用(这将成为它的单元测试)你只关心Go设置对象并调用保存

相关问题