Domanda

SFONDO

  • Sto automatizzando un PowerPoint 2007 tramite C#
  • Sto scrivendo unittest utilizzando lo unit test integrato di Visual Studio (Microsoft.VisualStudio.TestTools.UnitTesting) per il mio codice
  • Ho una certa esperienza nell'automazione delle app di Office 2007

IL MIO PROBLEMA

  • Quando eseguo i test unitari, il primo metodo di test unitario funziona correttamente, tutti quelli successivi presentano un errore relativo a un RCW scollegato
  • Sto creando un'istanza statica di PowerPoint per la condivisione dei metodi di test, ma sembra che l'applicazione RCW si stacchi dopo l'esecuzione del primo metodo di test

IL CODICE SORGENTE

    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;
            }
        }

    }

IL MESSAGGIO DI ERRORE

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

Questo messaggio arriva sulla riga in cui viene utilizzata l'istanza di PowerPoint (quando imposto la proprietà Visible)

QUELLO CHE HO PROVATO

  • L'ordine degli unittest non modifica il comportamento
  • Lo stesso problema si verifica con Word 2007, Visio 2007, ecc.
  • Quando scrivo test con NUNIT non riscontro questi problemi: ovviamente c'è qualcosa di diverso nel modo in cui Visual Studio esegue i test unitari (non implica che VS non sia corretto, ma semplicemente sottolinea che è diverso da NUNIT)
  • Non ha nulla a che fare con la proprietà Visible: qualsiasi utilizzo di un metodo o di una proprietà causerà questo problema
  • Ho provato a utilizzare gli attributi AssemblyInitialize e ClassInitialize per creare l'istanza ma non ha funzionato
  • Googled & Binged: nessuna risposta chiara che mi aiuti

COMMENTI

  • Potrei passare a NUNIT, ma preferirei continuare a utilizzare il framework di unit test nativo di Visual Studio

LA MIA DOMANDA

  • Come posso creare con successo una singola istanza di PowerPoint 2007 che verrà condivisa tra tutti i TestMethods
  • Se puoi fornire informazioni dettagliate Perché sta succedendo, te ne sarei grato.

RISOLTO (GRAZIE AD ALCONJA)

  • Ho seguito il suo consiglio per modificare .testrunconfig e ha funzionato.

LINK

È stato utile?

Soluzione

Sembra che il problema sia che i test unitari MS vengono eseguiti in più thread mentre i test NUnit vengono eseguiti nello stesso thread.Quindi il riferimento statico a PowerPoint durante l'esecuzione dei test MS è essere condiviso tra i thread, che a COM non piace poiché per impostazione predefinita è STA (a thread singolo).Puoi cambiare il test MS per utilizzare MTA (multi-threading per COM) aggiungendo:

<ExecutionThread apartmentState="MTA" />

nel tuo file *.testrunconfig (apri il file come XML e rimuovi la riga sopra ovunque nel principale TestRunConfiguration nodo).

Non sono sicuro di quanto bene PowerPoint (e i tuoi test specifici) gestiranno il trattamento come multi-thread, ma il tuo banale esempio sopra passa con MTA attivato.Se riscontri problemi di threading, puoi provare a creare il tuo file test unitari ordinati e vedi se questo risolve il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top