gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:32:14 25 4
gpt4 key购买 nike

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

正如我所看到的,有一个接口(interface)公开了返回 IObjectSet<...> 的方法,但是 T4 模板生成了返回 ObjectSet<...> 的方法并且没有生成的接口(interface),并且在该页面上作者将接口(interface)添加到创建了上下文,这为他提供了创建模拟等的方法。

我的主要目标是使用 T4 模板生成 poco 类并创建模拟/假上下文来测试我的自定义存储库。有没有什么办法可以让它在不编写或更改 T4 模板的情况下工作?如果它返回 ObjectSet 而不是 IObjectSets,我如何在上下文之上创建模拟(因为 IObjectSet 不是微不足道的)...

提前致谢

最佳答案

作者只是在模拟存储库,而不是实体。 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 的引用

关于c# - 使用 POCO 和 t4 模板测试 EF 4.0 - 如何模拟上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3617750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com