【问题标题】:How to decouple a middle tier and a dataset to allow for unit testing?如何解耦中间层和数据集以进行单元测试?
【发布时间】:2008-09-30 14:27:01
【问题描述】:

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

我提出了一个答案,显示了我的想法,但我对紧密耦合不满意。我刚刚开始进行测试,发现这是我的代码的一个很好的目标。

如何解耦这段代码以进行单元测试?

谢谢你,
基思

【问题讨论】:

    标签: c# .net integration-testing


    【解决方案1】:

    国际海事组织;数据集是邪恶的。它们是并且应该只用作离线数据库。仅此而已,IMO。但是,您在数据访问层 (DAL) 中所做的事情不应真正影响您的业务层 (BL)。我只是在它们之间使用对象(使用接口)(IList),然后使用接口来定义您的 DAL(IRepository),并且您可以模拟该接口以返回您在 BL 中需要的任何内容以进行单元测试。单元测试数据集是另一种野兽,从未尝试过,我希望永远不必...也许内存数据库是您最好的选择...

    哦,对于模拟,我使用 RhinoMock 取得了一些成功。我还鼓励您查看 IoC (http://www.castleproject.org/)。

    【讨论】:

    • 我同意。我目前有一个使用 NHibernate、Castle Windsor 和 RhinoMock 的应用程序,我很高兴。我使用存储库模式并且几乎完全与 DAL 解耦用于我的单元测试。再也不想回到数据集了
    【解决方案2】:

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

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

    他准确地展示了您正在寻找的东西。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这取决于您要测试的内容:

        • 是否要测试从数据库中检索数据?
        • 从数据集中构建对象?
        • 插入或更新数据库?
        • 等等……

        这里有一个建议:

        一个订单包含它的所有子订单。这是一个集合体,一个整体。 您会从存储库中获得包含详细信息的订单:

        var order = repository.GetOrderBy(id);
        

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

        var dataset = orderDatabase.GetOrderAndDetailsBy(id);
        

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

        var order = orderBuilder.CreateOrderAndDetailsFrom(dataset);
        

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

        var repository = new OrderRepository(orderDatabase, orderBuilder);
        

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

        【讨论】:

          【解决方案5】:

          如果你有实体对象,你可以使用 mocks 对你的中间层进行单元测试。

          RWendi

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-05-21
            • 2011-02-16
            • 2011-09-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多