加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 07:46:01 所属栏目:百科 来源:网络整理
导读:我正在尝试创建符合 http://blogs.msdn.com/b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-0.aspx的假上下文 正如我所看到的,有一个接口公开了返回IObjectSet ...的方法,但是T4模板生成了返回ObjectSet ...
我正在尝试创建符合 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提前

解决方法

作者只是模拟存储库,而不是实体. 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;

如果是这样,我猜你会花更多的时间用T4然后你就会写它.

示例T4没有类声明…您可以按照this blog完成整个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)#>;
<#
 }

#>

哪个会产生这个代码:

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

private FakeObjectSet<Blog> _Blogs;

边注.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读