【问题标题】:Cannot mock something like TableDomainService where the EntityContext is set in the class definition无法模拟 TableDomainService 之类的东西,其中 EntityContext 在类定义中设置
【发布时间】:2011-06-06 01:48:24
【问题描述】:

我正在尝试专门使用 Moq 来学习和实施 TDD,但我遇到了一个我无法弄清楚如何模拟的设计:

namespace RIACompletelyRelativeWebService.Web.Services
{
    [EnableClientAccess]
    public class AncestorDomainService : TableDomainService<AncestorEntityContext>
    {
        public AncestorDomainService()
        {
            //this.EntityContext = new AncestorEntityContext();
        }
        public IQueryable<AncestorEntity> GetAncestorEntities()
        {
            return this.EntityContext.AncestorEntities;
        }

        public void AddAncestorEntity(AncestorEntity entity)
        {
            this.EntityContext.AncestorEntities.Add(entity);
        }
    }
}

我认为我需要模拟 TableDomainService 以便我可以在不启动 Azure 的情况下测试我的 AncestorDomainService 逻辑。我厌倦了这样的事情:

public class AncestorDomainService<TEntityContext> : TableDomainService<TEntityContext> where TEntityContext is a TableEntityContext

但是,TableDomainService 不喜欢使用泛型。我也尝试设置 EntityContext 但它是只读的。我见过其他人使用通用 DomainService 和 Repository 设计模式,但由于 TableDomainService 让我可以在幕后使用 Azure 表,所以我认为我必须坚持使用 TableDomainService。我只需要伪造返回的 TableDomainService、TableEntityContext 和 TableEntitySet 吗?

【问题讨论】:

    标签: entity-framework tdd mocking moq domainservices


    【解决方案1】:

    从上面的代码中我不知道您要测试的逻辑是什么样的,但是您可以尝试将您的代码(您要测试的代码)与服务本身分开。

    您可以尝试抽象 AncestorDomainService(引入 IAncestorDomainService),然后使用 moq 来模拟 IAncestorDomainService。您的逻辑将移至另一个依赖于 IAncestorDomainService 的类。我已经用 Linq2Sql 完成了这个(它似乎有类似的设计并且也返回 IQueryable)。我不会试图模拟 TableDomainService 的“内部”,因为这些东西通常不是为方便测试而设计的。

    【讨论】:

      【解决方案2】:

      如果您有足够的时间,最好的解决方案是让您的代码完全可测试。这意味着实际上拥有设置具有已知良好状态的 Azure 实例(真实或本地)所需的脚本。

      由于您的 AncestorDomainService 的全部意义在于处理 Azure,因此模拟其基类对于测试有效性而言没有多大意义。 (有些人选择优化测试速度而不是有效性,但我认为这是浪费时间。)

      【讨论】:

        猜你喜欢
        • 2012-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-12
        • 1970-01-01
        • 2012-05-19
        • 2017-09-15
        • 1970-01-01
        相关资源
        最近更新 更多