3

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

// 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。

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

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

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

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

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

如何测试此功能?我应该使用什么测试框架?我离使用 Silverlight 测试框架还有距离吗?

4

2 回答 2

2

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

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

作为辅助说明:我并不真正同意另一个答案的最后一部分,因为您不应该关心 Go 是否调用 _DataContext 的各种方法。诚然,您并不关心在这里测试 _DataContext 方法,但 Go 的单元测试需要确保 Go 方法正确调用了 _DataContext 方法。理由是 Go 方法的每一行都应该是可测试的。如果您没有进行此验证,那么您可以删除对 _DataContext 方法的调用,从而破坏代码,但单元测试不会捕获它。这将打破 Bob Martin 的“TDD 三个规则”原则。

于 2009-10-14T14:43:17.310 回答
1

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

你甚至不需要走那么远。您可以只使用 _DataContext 的模拟接口和 RhinoMocks 之类的东西,以确保您期望调用的方法是(这不是您对 _DataContext.SubmitChanges() 工作的测试的关注(那就是它的单元测试) ) 你只关心 Go 设置对象并调用保存。

于 2009-10-13T21:29:28.173 回答