在为接口生成垫片和为密封类型生成存根时,假组件会显示警告

时间:2013-10-15 11:06:33

标签: c# unit-testing structuremap microsoft-fakes irepository

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

:无法为StructuremapMvc生成存根:type已被密封。  :无法为IUnitOfWork生成填充程序:type是一个接口。  :无法为Repository.IRepository`1生成填充程序:type是一个接口。

等等。

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

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

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

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

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