【问题标题】:How do I Unit Test a function that inserts a record into a RIA Services DB?如何对将记录插入 RIA 服务数据库的函数进行单元测试?
【发布时间】:2009-10-14 22:43:17
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • 测试多层绝非易事...模拟、单独测试还是重新考虑?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多