不久前已经提出了一个几乎类似的问题,但尚未得到回答。由于我的设置有点不同,我开始了新的尝试:
我演示了我的代码的缩短版本,但即使是这个简短版本也会产生错误。
我有一个返回 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
以及如何解决它?
我在这个问题上设置了赏金,可能会通过相同的答案来解决。因此,如果您认为您的答案值得赏金,请随时在此处发布。