Вызов кнопки ленты Excel для установленной надстройки ExcelDna в рамках интеграционного теста - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь создать интеграционные тесты для надстройки Excel, разработанной с использованием автоматизации ExcelDna и VSTO.Я хотел бы протестировать различные функции нашего приложения, но мне нужно использовать CommandBar для нашей панели команд надстроек.

Я пытаюсь использовать ссылку Microsoft.Office.Interop.Excel и метод RegisterXLL для регистрации XLL вExcel.

Я пытаюсь создать тесты для Windows 10 с установленным Office 365.

У меня возникло несколько проблем, связанных с тем, что на нем много потенциально устаревших сообщений.

Первоначально я создал экземпляр приложения Excel, зарегистрировал надстройку и попытался использовать Microsoft.Office.Interop.Excel.SendKeys для отправки нажатий клавиш на экземпляр Excel.Хотя я изначально мог заставить это работать при отладке теста с точками останова, он не работает во время выполнения тестов.Есть несколько сообщений, которые указывают, что в Windows 10 Office теперь является универсальным приложением и что SendKeys больше не будет работать, поскольку он нарушает UAC, и вызовы API Win32 для отправки ключей в приложение аналогичным образом не работают, поскольку Office является универсальным приложением.

Моя вторая попытка - попытаться вызвать Командную панель и ее пункты меню с помощью кода автоматизации VSTO, и я не могу найти сообщений, которые указывают, как вызывать функции командной строки в другом домене приложения.

Кроме того, когда я закрываю экземпляр Excel, я замечаю, что всегда выполняется процесс Excel, даже несмотря на то, что приведенный ниже код используется для уничтожения приложения Excel.

    void CloseApp()
    {
        xlApp.Quit();
        xlApp = null;

        GC.Collect();
        GC.WaitForPendingFinalizers();
    }

Я в замешательствео том, как это будет достигнуто.Есть ли у кого-нибудь сообщения, на которые они могут указать, чтобы решить эти проблемы, которые все еще работают?

1 Ответ

1 голос
/ 05 апреля 2019

Что касается закрытия, вы можете разделить код с помощью вызовов COM из вызовов GC, чтобы гарантировать, что отладчик не поддерживает локальные переменные (и не позволяет GC запускать и освобождать объекты COM. Итак, вы хотите следовать этой схеме:

using System;
using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Excel;

namespace TestCsCom
{
    class Program
    {
        static void Main(string[] args)
        {
            // NOTE: Don't call Excel objects in here... 
            //       Debugger would keep alive until end, preventing GC cleanup

            // Call a separate function that talks to Excel
            DoTheWork();

            // Now let the GC clean up (repeat, until no more)
            do
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            while (Marshal.AreComObjectsAvailableForCleanup());
        }

        static void DoTheWork()
        {
            Application app = new Application();
            Workbook book = app.Workbooks.Add();
            Worksheet worksheet = book.Worksheets["Sheet1"];
            app.Visible = true;
            for (int i = 1; i <= 10; i++) {
                worksheet.Cells.Range["A" + i].Value = "Hello";
            }
            book.Save();
            book.Close();
            app.Quit();

            // NOTE: No calls the Marshal.ReleaseComObject() are ever needed
        }
    }
}
...