使用POCO和t4模板测试EF 4.0 - 模拟上下文如何?

Sim*_*mon 7 c# t4 entity-framework-4

我正在尝试创建符合http://blogs.msdn.com/b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-的假上下文0.aspx

我可以看到有一个接口公开返回IObjectSet <...>的方法,但是T4模板生成返回ObjectSet <...>的方法,并且没有生成的接口,并且在该页面上作者将接口添加到创建的上下文和它给了他创建模拟等的方法

我的主要目标是使用T4模板生成poco类并创建模拟/伪上下文来测试我的自定义存储库.有没有办法让它无需编写或更改T4模板?如果它返回ObjectSet而不是IObjectSets,我如何在上下文之上创建模拟(对于IObjectSet并不是一件容易的事)...

Thx提前

Nix*_*Nix 3

作者只是嘲笑存储库,而不是实体。EntityFramework 生成 ObjectQueries,但他包装它们并且他的存储库返回 IObjectQueries。他这样做是为了可以轻松地模拟数据,然后在保存期间他只需验证实体。

如果您只是尝试创建一个“模拟”存储库,您可以创建自己的 T4 模板并迭代 edmx 文件并生成代码。但有什么理由一定要生成POCOS呢?它们已经存在,为什么需要重新创建它们?他将所有内容抽象为“通用”FakeObjectSet,因此真的不需要编写那么多代码吗?

您是否正在尝试生成这个:

   public IObjectSet<Blog> Blogs
    {
        get
        {
            return _blogs ?? (_blogs = new FakeObjectSet<Blog>());
        }
        set
        {
            _blogs = value as FakeObjectSet<Blog>;
        }
    }
    private FakeObjectSet<Blog> _blogs;
Run Code Online (Sandbox Code Playgroud)

如果是这样,我猜你会花更多的时间在 T4 上,然后你就会只是写它。


没有类声明的示例 T4...您可以按照此博客完成完整的 t4

<#
    foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>())
    {
#>
public IObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>>
{
    get{
       return <#=code.FieldName(set)#> ??  ( <#=code.FieldName(set)#> = FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>>("<#=set.Name#>"));
    }
    set{
   <#=code.FieldName(set)#>  = value as FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>>("<#=set.Name#>");
    }
}
 private FakeObjectSet<<#=MultiSchemaEscape(set.ElementType, code)#>> <#=code.FieldName(set)#>;
<#
 }

#>
Run Code Online (Sandbox Code Playgroud)

这将生成以下代码:

public IObjectSet<Blogs>{
  get{
     return _Blogs??  ( _Blogs = FakeObjectSet<Blog>("Blogs"));
   }
  set{
    _Blogs= value as FakeObjectSet<Class>("Blogs");
  }
}

private FakeObjectSet<Blog> _Blogs;
Run Code Online (Sandbox Code Playgroud)

边注。

IObjectSet包含在 System.Data 中,因此添加对 System.Data.Entity.dll 的引用