前一段时间已经提出过几乎相似的question,但尚未回答。由于我的设置略有不同,我开始尝试新的尝试:
我展示了我的代码的缩短版本,但即使是这个简短的版本也会产生错误。
我有一个返回System.Printing.LocalPrintServer
的实例的方法:
public class PrintServerProvider
{
public LocalPrintServer Provide()
{
return new LocalPrintServer(new string[0], PrintSystemDesiredAccess.EnumerateServer);
}
}
对于这种方法,我使用垫片实现了单元测试:
[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(更新1)中,当测试方法调用new LocalPrintServer(...)
时
提出了InvalidProgramException 在System.Printing.LocalPrintServer..ctor(String [] propertiesFilter,PrintSystemDesiredAccess desiredAccess) 在C:\ Projects \ DemoProject \ Program.cs中的DemoProject.PrintServerProvider.Provide():第10行。 ...
。 (正常的生产调用工作正常。只有在运行测试方法时才会引发异常)
引用的程序集是:
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
的原因以及解决方法吗?
我在this question上设置了奖金,这可能会通过相同的答案解决。如果你认为你的答案是赏金的话,也可以随意发帖。