11

我有一个配置了 CI 帖子的构建,其中运行了一些测试。尽管测试成功运行,但构建显示警告:

: 无法为 StructuremapMvc 生成存根:类型已密封。: 无法为 IUnitOfWork 生成垫片:类型是一个接口。:无法为 Repository.IRepository`1 生成 shim:类型是一个接口。

等等。

我正在使用通用存储库模式和工作单元。我已经为我的 MVC WebApi 项目(它利用 StructureMap 的依赖注入)和包含我的存储库和 UnitOfWork 的数据项目添加了 Fake Assemblies。我已经探索过这个错误,并且似乎有点相信这可能是由于 Fake Assemblies 的限制,但我需要绝对确定我没有做错任何事

4

2 回答 2

18

我摆脱这些警告的方法是只创建需要的垫片。我在 fakes 配置文件中添加了以下内容。

  <ShimGeneration>
    <Clear/>
    <Add FullName="ATypeToShim!"/>
    <Add FullName="AnotherTypeToShim!"/>
  </ShimGeneration>

这 !在过滤器的末尾使其成为区分大小写的精确匹配。

对于存根,我只使用存根接口,所以很简单:

<StubGeneration>
  <Clear />
  <Add Interfaces ="true"/>
</StubGeneration>

这里有更多详细信息:http: //msdn.microsoft.com/en-us/library/hh708916.aspx#bkmk_type_filtering

于 2014-01-29T12:01:44.723 回答
3

这不是假货的真正限制,但也不是真正的错误。你需要知道的是什么是存根和垫片。

存根很简单:它们是一个实现或扩展某个类的类,用一个委托属性和一个标志来覆盖每个方法,以确定它是否应该在之后调用基类(注意:该标志适用于整个存根,而不是每个方法) . 您可以使用它们来注入依赖项,因为它们允许您在代码中的 lambdas 中定位所有逻辑,而不是在某个生成的类中。因为它们扩展了非接口,所以密封类不能被存根。

垫片更复杂,因为它们适用于指定类型的任何实例。不确定这是如何完成的,但对您来说重要的是,由于接口不能有实例,所以它不能有 shim。没关系,因为那是您应该使用存根的地方。它们很危险,因为使用 shim,您会覆盖整个 shimscontext 中的函数结果,并且几乎只发生在您无法访问的东西中断时 - 最好注入的东西。

所以我不会担心警告。它们并不是什么重要的事情,只是确保你知道发生了什么。

于 2013-10-18T16:50:05.910 回答