Джереми, ты сделал мою неделю! Большое спасибо - это сработало, и мой уровень счастья сейчас не поддается словам. Я тоже выдернул себе волосы, оставил их на некоторое время, а потом снова начал зацикливаться на этом. Еще раз спасибо!

ение последних недель я работал и читал различные вопросы StackOverflow и другие учебные пособия и документацию (см. Некоторые из них ниже), чтобы попытаться найти способ модульного тестирования надстройки VSTO.

К сожалению, это всегда приводит кE_NOINTERFACE исключение в моих тестах.

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

Мой вопрос: почему это не работает? Я уверен, что это следует общепринятым методам тестирования VSTO.

Если нижеприведенное невозможно, как можно проверить VSTO? Является ли .NET remoting / IPC единственным решением?

ThisAddin.cs
public partial class ThisAddin 
{
    #region Testing Utilities

    private AddinHelper _comAddinObject;

    protected override object RequestComAddInAutomationService()
    {
        // This is being called when I debug/run my project, but not when I run the tests
        return _comAddinObject ?? (_comAddinObject = new AddinHelper());
    }

    #endregion
}

#region Testing Utilities

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAddinHelper
{
    Presentation GetPresentation();
    string GetString();
}

[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ComSourceInterfaces(typeof(IAddinHelper))]
public class AddinHelper : StandardOleMarshalObject, IAddinHelper
{
    public Presentation GetPresentation()
    {
        return Globals.ThisAddin... [...];
    }

    public string GetString()
    {
        return "Hello World!";
    }
}

#endregion
AssemblyInfo.cs
[assembly: InternalsVisibleTo("MyProject.Tests")]
MyUnitTest.cs (имеет ссылку наMyProject)
[TestClass]
public class BasicTest
{
    [TestMethod]
    public void TestInstantiates()
    {
        var application = new Application();
        var doc = application.Presentations.Open(@"C:\Presentation.pptx",
            MsoTriState.msoFalse, MsoTriState.msoFalse, MsoTriState.msoFalse);
        var comAddins = application.COMAddIns;
        var comAddin = comAddins.Item("MyProject"); // Returns okay
        var comObject = (IAddinHelper) comAddin.Object; // Exception occurs

        Assert.AreEqual(true, true); // Never reached

        doc.Close();
    }
}

Кроме того, в настройках проекта установлено значение «Зарегистрироваться для взаимодействия COM», и Visual Studio работает без повышенных прав - выполнение его без прав администратора приводит к тому, что библиотеки DLL не регистрируются; поэтому я также знаю, что COM-объектыявляются зарегистрировано.

Результирующее исключение

Исключение типа «System.InvalidCastException» произошло в MyProject.Tests.dll, но не было обработано в коде пользователя. Дополнительная информация: Невозможно преобразовать COM-объект типа «System .__ ComObject» в интерфейс типа «MyProject.IAddinHelper». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{59977378-CC79-3B27-9093-82CD7A05CF74}' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) ,

Переполнение стека

Как вызвать класс VSTO из другого проекта c #Модульное тестирование проектов ВСТОНадстройки VSTO, COMAddIns и RequestComAddInAutomationService (Register for COM Interop ничего не меняет)Почему я не могу привести мой COM-объект к интерфейсу, который он реализует в C #? (проблема скорее всего не связана с STAThread)https://sqa.stackexchange.com/questions/2545/how-do-i-unit-test-word-addin-written-in-c

Microsoft

https://blogs.msdn.microsoft.com/varsha/2010/08/17/writing-automated-test-cases-for-vsto-application/ <- Даже с этим предположительно работающим примером проекта я получаю точно такую ​​же ошибку.https://msdn.microsoft.com/en-us/library/bb608621.aspxОбщий фон рабочего процесса:https://msdn.microsoft.com/en-us/library/bb386298.aspx

Честно говоря, я не знаю, как можно тестировать надстройки VSTO без этой работы.

Ответы на вопрос(0)

Ваш ответ на вопрос