VS2008 UnitTesting — отдельный RCW с объектами приложений Office (PowerPoint и т. д.)

StackOverflow https://stackoverflow.com/questions/1117812

Вопрос

ФОН

  • Я автоматизирую PowerPoint 2007 через C#.
  • Я пишу модульные тесты, используя встроенное модульное тестирование Visual Studio (Microsoft.VisualStudio.TestTools.UnitTesting) для своего кода.
  • У меня достаточно опыта в автоматизации приложений Office 2007.

МОЯ ПРОБЛЕМА

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

ИСХОДНЫЙ КОД

    using System;
    using System.Text;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    namespace TestDemo
    {



        [TestClass]
        public class UnitTest1
        {
            private static Microsoft.Office.Interop.PowerPoint.ApplicationClass 
              g_app = new Microsoft.Office.Interop.PowerPoint.ApplicationClass();

            private TestContext testContextInstance;

            public TestContext TestContext
            {
                get
                {
                    return testContextInstance;
                }
                set
                {
                    testContextInstance = value;
                }
            }



            [TestMethod]
            public void Test01()
            {
                g_app.Visible = Microsoft.Office.Core.MsoTriState.msoCTrue;
            }

            [TestMethod]
            public void Test02()
            {
                g_app.Visible = Microsoft.Office.Core.MsoTriState.msoCTrue;
            }
        }

    }

СООБЩЕНИЕ ОБ ОШИБКЕ

Test method TestDemo.UnitTest1.Test02 threw exception:
System.Runtime.InteropServices.InvalidComObjectException: COM 
object that has been separated from its underlying RCW cannot be used..

Это сообщение появляется в строке, где используется экземпляр PowerPoint (когда я устанавливаю свойство Visible).

ЧТО Я ПРОБОВАЛ

  • Порядок юнит-тестов не меняет поведение
  • Та же проблема возникает с Word 2007, Visio 2007 и т. д.
  • При написании тестовых примеров с помощью NUNIT я не сталкиваюсь с этой проблемой - очевидно, что-то по-другому в том, как Visual Studio запускает модульные тесты (это не значит, что VS неверен, просто указываю на то, что он отличается от NUNIT).
  • Это не имеет ничего общего со свойством Visible — любое использование метода или свойства приведет к этой проблеме.
  • Я пробовал использовать атрибуты AssemblyInitialize и ClassInitialize для создания экземпляра, но ничего не помогло.
  • Googled и Binged – нет четкого ответа, который мне помог бы

КОММЕНТАРИИ

  • Я мог бы переключиться на NUNIT, но предпочел бы продолжать использовать собственную среду модульного тестирования Visual Studio.

МОЙ ВОПРОС

  • Как я могу успешно создать один экземпляр PowerPoint 2007, который будет использоваться всеми TestMethods?
  • Если вы можете дать представление о почему это происходит, я был бы благодарен.

РЕШЕНО (СПАСИБО ALCONJA)

  • Я последовал его совету и изменил .testrunconfig, и это сработало.

ССЫЛКИ

Это было полезно?

Решение

Похоже, проблема в том, что модульные тесты MS выполняются в нескольких потоках, тогда как тесты NUnit выполняются в одном потоке.Таким образом, статическая ссылка на PowerPoint при выполнении тестов MS равна распределяется между потоками, что не нравится COM, поскольку по умолчанию его STA (однопоточный).Вы можете переключить тест MS на использование MTA (многопоточность для COM), добавив:

<ExecutionThread apartmentState="MTA" />

в ваш файл *.testrunconfig (откройте файл как XML и удалите приведенную выше строку где угодно в главном TestRunConfiguration узел).

Не уверен, насколько хорошо PowerPoint (и ваши конкретные тесты) будут рассматриваться как многопоточные, но ваш тривиальный пример выше проходит с включенным MTA.Если у вас возникли проблемы с потоками, вы можете попробовать сделать заказаны модульные тесты и посмотрите, решит ли это проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top