InvalidProgramException с прокладками в Visual Studio 2015
Почти аналогичный вопрос уже задавался некоторое время назад, но пока не получил ответа. И поскольку мои настройки немного отличаются, я начинаю новую попытку:
Я демонстрирую сокращенную версию моего кода, но даже эта короткая версия выдает ошибку.
У меня есть метод, который возвращает экземпляр 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 требуемый Access) в DemoProject.PrintServerProvider.Provide() в C:\Projects\DemoProject\Program.cs: строка 10. ...
Поднялся. (Обычный производительный вызов работает нормально. Исключение возникает только при запуске метода теста)
Упомянутые сборки:
- System.Printing (v4.0.30319) из C:\Program Files (x86)\ Справочные сборки \ 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
и как это решить?
Я назначил награду за этот вопрос, который, вероятно, будет решен тем же ответом. Так что не стесняйтесь писать там тоже, если считаете, что ваш ответ заслуживает награды.