如何解耦中间层和数据集以允许单元测试?

时间:2008-09-30 14:27:01

标签: c# .net integration-testing

我在SO处有一个问题,询问如何将中间层连接到DataSet。

我提出了一个答案,显示了我的想法,但我对紧耦合感到不满意。我刚刚开始进行测试,并为我的代码找到了一个很好的目标。

如何将此代码解耦以允许进行单元测试?

谢谢你,
基思

5 个答案:

答案 0 :(得分:3)

IMO; DataSet是邪恶的。它们是,并且应该仅用作脱机数据库。没什么了,IMO。但是,您在数据访问层(DAL)中执行的操作不应该真正影响您的业务层(BL)。我只是在它们之间使用对象(使用接口)(IList),然后使用接口来定义你的DAL(IRepository),并且你可以模拟该接口以返回BL中用于单元测试的任何内容。单元测试数据集是另一个野兽,从来没有尝试过,我希望永远不要......可能内存数据库是你最好的选择......

哦,为了嘲笑我已经使用了RhinoMock取得了一些成功。我也鼓励你看看IoC(http://www.castleproject.org/)。

答案 1 :(得分:1)

您需要IOC(控制反转)和模拟对象。

我鼓励你和James Kovacs一起观看dnrTV episode 126

他完全展示了你在寻找什么。

答案 2 :(得分:0)

你试过Spring.net吗?它将使您的代码更清晰,更少耦合。它还提供useful classes来进行集成测试。

答案 3 :(得分:0)

这取决于你想要测试的内容:

  • 您想测试数据库中的数据检索吗?
  • 从数据集构建对象?
  • 插入或更新数据库?
  • 依旧......

这是一个建议:

订单包含其所有子项。这是一个整体,一个整体。 您从订单中获得包含详细信息的订单:

var order = repository.GetOrderBy(id);

存储库从数据库中获取数据:

var dataset = orderDatabase.GetOrderAndDetailsBy(id);

存储库可以使用构建器来创建订单:

var order = orderBuilder.CreateOrderAndDetailsFrom(dataset);

您必须按如下方式创建存储库:

var repository = new OrderRepository(orderDatabase, orderBuilder);

现在,您可以创建一个包含假协作者的存储库,具体取决于您要测试的内容。

答案 4 :(得分:-2)

如果您有实体对象,则可以使用模拟对中间层进行单元测试。

RWendi