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

ЗАДНИЙ ПЛАН

  • Я автоматизирую PowerPoint 2007 через С#
  • Я пишу модульные тесты, используя встроенное модульное тестирование 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, и это сработало.

ССЫЛКИ


person namenlos    schedule 13.07.2009    source источник
comment
Извините, я не могу вам помочь напрямую, но это очень четкий / хорошо написанный вопрос, поэтому я ставлю вам +1 в надежде помочь вам стать более заметным.   -  person Alconja    schedule 13.07.2009
comment
Хорошо, я солгал, похоже, я могу помочь. Смотрите мой ответ ниже.   -  person Alconja    schedule 13.07.2009
comment
Отличная структура. Это мне очень помогло.   -  person Gustavo    schedule 14.08.2010


Ответы (1)


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

<ExecutionThread apartmentState="MTA" />

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

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

person Alconja    schedule 13.07.2009