Джереми, ты сделал мою неделю! Большое спасибо - это сработало, и мой уровень счастья сейчас не поддается словам. Я тоже выдернул себе волосы, оставил их на некоторое время, а потом снова начал зацикливаться на этом. Еще раз спасибо!
ение последних недель я работал и читал различные вопросы StackOverflow и другие учебные пособия и документацию (см. Некоторые из них ниже), чтобы попытаться найти способ модульного тестирования надстройки VSTO.
К сожалению, это всегда приводит кE_NOINTERFACE
исключение в моих тестах.
Код, который я использую, приведен ниже - один фрагмент частичного класса ThisAddin, переопределяющийRequestComAddinAutomationService
другой, описывающий интерфейс утилиты тестирования, сам тест, а также дополнительную выдержку из сборки, доказывающую, что сборка AddIn и ее внутренние компоненты видимы для теста.
Мой вопрос: почему это не работает? Я уверен, что это следует общепринятым методам тестирования VSTO.
Если нижеприведенное невозможно, как можно проверить VSTO? Является ли .NET remoting / IPC единственным решением?
ThisAddin.cspublic 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-cMicrosoft
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 без этой работы.