VS2008 UnitTesting - отдельное RCW с объектами приложения Office (PowerPoint и т. Д.) - PullRequest
7 голосов
/ 13 июля 2009

ФОН

  • Я автоматизирую 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, и это сработало.

ССЫЛКА

1 Ответ

7 голосов
/ 13 июля 2009

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

<ExecutionThread apartmentState="MTA" />

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

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

...