VS 2012:Shims编译

11

我正在尝试按照MSDN网站上的描述,在VS 2012 ultimate中制作一个shim:

[TestClass]
public class TestClass1
{ 
    [TestMethod]
    public void TestCurrentYear()
    {
        int fixedYear = 2000;

        using (ShimsContext.Create())
        {
          // Arrange:
          // Detour DateTime.Now to return a fixed date:
          System.Fakes.ShimDateTime.NowGet = 
              () =>
              { return new DateTime(fixedYear, 1, 1); };

          // Instantiate the component under test:
          var componentUnderTest = new MyComponent();

          // Act:
          int year = componentUnderTest.GetTheCurrentYear();

          // Assert: 
          // This will always be true if the component is working:
          Assert.AreEqual(fixedYear, year);
        }
    }
}

请查看http://msdn.microsoft.com/en-us/library/hh549176.aspx

但是,当我编译我的测试项目时,输出中会出现一个提示:

警告:某些桩无法生成。如需完整详细信息,请将此文件中 Fakes 元素的 Diagnostic 特性设置为 "true" 并重新生成该项目。

我应该如何解决这个警告?


在哪篇MSDN文章中有描述?我们这里没有足够的信息来猜测答案。 - Oded
已编辑。现在回滚您-1。 - alerya
3个回答

39

Visual Studio 2012 Update 1改进了Fakes中的代码生成,以简化代码生成问题的故障排除。每当无法为特定类型生成Stub或Shim时,Fakes现在可以生成警告消息 - 您可以在Visual Studio的错误列表窗口中看到此消息。

然而,为了防止对于大型程序集(如System)警告数量过多,Fakes默认情况下仅生成一条警告。您可以通过将.Fakes文件中的 XML元素的属性设置为"true"或"1"并重新构建项目来查看完整的警告消息列表。(请参见下面代码的第一行作为示例。)

要解决警告,请更改.Fakes文件以仅生成您在测试中需要的那些Stubs和Shims。详情请参见这里这里,其中包含所有可用选项的完整列表。

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true">
  <Assembly Name="System" Version="4.0.0.0"/>
  <StubGeneration Disable="true" />
  <ShimGeneration>
    <Clear/>
    <Add FullName="System.DateTime!"/>
  </ShimGeneration>
</Fakes>

3
有没有办法抑制警告信息?我将“Diagnostic”设置为假,“Verbosity”设置为关键,但仍然收到警告,提示某些伪造品无法生成。 - Zorayr
1
是的。使用此答案中描述的方法仅生成您需要的存根和桥接类型。不要指定无法进行存根或桥接的类型。 - Oleg Sych
1
嗨!我在尝试添加特定的Shims或Stubs时遇到了一些问题,Visual Studio中的Rebuild / Clean选项不会删除预编译的Fakes程序集,因此如果有人在执行此操作时遇到问题,请记得手动删除FakesAssemblies文件夹。 - juan25d
有没有办法在诊断为假时抑制甚至“单个警告”生成。制作需要或需要删除的列表是不可行的。我们不能只为伪造物压制所有警告吗? - Rahul

2

我已独自解决了它。

这是属性中的.Net Framework 4.0。

更改为4.5解决了问题。


4
在单元测试项目中更改目标 .NET 框架版本可以减少遇到 Fakes 不支持的类型的机会,但这并不能直接消除该警告信息。 - Oleg Sych
你能解释一下你所说的“在属性中是 .Net Framework 4.0”的意思吗? - Gheorghe Bulicanu
项目属性。我使用的是 .net 4.0。但需要 4.5。 - alerya
@OlegSych的回答应该被标记为正确答案 - 他的回应比当前被标记为答案的更相关于这个问题。 - Rockdocta

0

尝试删除那些 .Fakes 文件。 我不小心把它们删除了,然后编译,警告消失了。 我不确定影响是什么,但一切似乎都运行正常。我认为这会导致编译在每次构建时重新编译 fakes 文件。


3
如果你删除了".fakes"文件,就无法进行虚假操作了。这将完全违背其设计初衷。 - crthompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接