7

不久前已经提出了一个几乎类似的问题,但尚未得到回答。由于我的设置有点不同,我开始了新的尝试:

我演示了我的代码的缩短版本,但即使是这个简短版本也会产生错误。

我有一个返回 a 实例的方法System.Printing.LocalPrintServer

public class PrintServerProvider
{
    public LocalPrintServer Provide()
    {
        return new LocalPrintServer(new string[0], PrintSystemDesiredAccess.EnumerateServer);
    }
}

对于这种方法,我使用 shims 实现了一个单元测试:

[TestClass]
public class PrintServerProviderTests
{
    [TestMethod]
    public void Provide_Success()
    {
        using (ShimsContext.Create())
        {
            bool constructorCalled = false;
            ShimLocalPrintServer.ConstructorStringArrayPrintSystemDesiredAccess = (instance, props, access) =>
            {
                constructorCalled = true;
            };

            PrintServerProvider provider = new PrintServerProvider();
            LocalPrintServer server = provider.Provide();
            Assert.IsNotNull(server);
            Assert.IsTrue(constructorCalled);
        }
    }
}

在 Visual Studio 2013中,此测试运行良好
但是在 Visual Studio 2015 (Update 1)中,当被测方法new LocalPrintServer(...)调用

InvalidProgramException at System.Printing.LocalPrintServer..ctor(String[] propertiesFilter, PrintSystemDesiredAccessdesiredAccess) at DemoProject.PrintServerProvider.Provide() in C:\Projects\DemoProject\Program.cs:Line 10. ...

被提出。(正常的生产调用工作正常。仅在运行测试方法时引发异常)

引用的程序集是:

  • System.Printing (v4.0.30319) 来自 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Printing.dll
  • System.Printing.4.0.0.0.Fakes
  • Microsoft.QualityTools.Testing.Fakes (v2.0.50727) 来自 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\PublicAssemblies\Microsoft.QualityTools.Testing.Fakes.dll

System.Printing.Fakes

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

两个项目(生产和测试)都使用 .NET Framework 4.5。

我尝试重置框架以及参考。我尝试了不同版本的引用程序集。我尝试了所有变体的 64 位和 32 位。

在实际代码中,我也使用其他类的垫片。LocalPrintServer是唯一发生异常的类。

任何人都可以解释这是什么原因InvalidProgramException以及如何解决它?

我在这个问题上设置了赏金,可能会通过相同的答案来解决。因此,如果您认为您的答案值得赏金,请随时在此处发布。

4

0 回答 0