1

我正在尝试专门使用 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 吗?

4

2 回答 2

2

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

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

于 2011-03-14T08:05:51.187 回答
0

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

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

于 2011-08-22T02:34:01.553 回答