我正在尝试使用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?
答案 0 :(得分:2)
我从上面的代码中不知道您想要测试的逻辑是什么样的,但您可能会尝试从服务本身分离您的代码(您要测试的代码)。
您可以尝试抽象AncestorDomainService(引入IAncestorDomainService),然后使用moq来模拟IAncestorDomainService。您的逻辑将移动到另一个依赖于IAncestorDomainService的类。我用Linq2Sql做了这个(它似乎有类似的设计,也返回IQueryable)。我不会试图模仿TableDomainService的“内部”,因为这些东西通常不是为简单测试而设计的。
答案 1 :(得分:0)
如果您能负担得起时间,那么最好的解决方案就是让您的代码完全可测试。这意味着实际上具有设置具有已知良好状态的Azure(真实或本地)实例所必需的脚本。
由于AncestorDomainService的重点是处理Azure,因此模拟其基类对于测试有效性没有多大意义。 (有些人选择优化测试速度而不是有效性,但我认为这是浪费时间。)