无法模拟像TableDomainService这样在类定义中设置EntityContext的内容

时间:2011-01-09 13:23:15

标签: entity-framework tdd mocking moq domainservices

我正在尝试使用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&lt;&gt;。我是否只需要伪造TableDomainService,TableEntityContext和返回的TableEntitySet?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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