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 и как это решить?

Я назначил награду за этот вопрос, который, вероятно, будет решен тем же ответом. Так что не стесняйтесь писать там тоже, если считаете, что ваш ответ заслуживает награды.

0 ответов

Другие вопросы по тегам