Есть ли у кого-нибудь предложения по модульному тестированию надстройки управляемого приложения для Office? Я использую NUnit, но у меня были те же проблемы с MSTest.
Проблема в том, что внутри приложения Office (в моем случае Word) загружена сборка .NET, и мне нужна ссылка на этот экземпляр сборки .NET. Я не могу просто создать экземпляр объекта, потому что тогда у него не будет экземпляра Word, с которым можно что-то делать.
Теперь я могу использовать интерфейс Application.COMAddIns("Name of addin").Object для получения ссылки, но это дает мне COM-объект, который возвращается через RequestComAddInAutomationService. Мое решение до сих пор заключается в том, чтобы у этого объекта были прокси-методы для каждого метода в реальном объекте .NET, который я хочу протестировать (все они установлены при условной компиляции, поэтому они исчезают в выпущенной версии).
Объект COM (класс VB.NET) на самом деле имеет ссылку на экземпляр настоящей надстройки, но я попытался просто вернуть его в NUnit и получил приятную ошибку p/Invoke:
System.Runtime.Remoting.RemotingException : у этого удаленного прокси-сервера нет приемника каналов, что означает, что либо у сервера нет зарегистрированных серверных каналов, которые прослушиваются, либо у этого приложения нет подходящего клиентского канала для связи с сервером. в System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, логическое значение useDispatchMessage, Int32 callType) в System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg) в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData& msgData, тип Int32)
Я попытался сделать основную надстройку COM видимой, и ошибка изменилась:
System.InvalidOperationException : операция недействительна из-за текущего состояния объекта. в System.RuntimeType.ForwardCallToInvokeMember (String memberName, BindingFlags flags, Object target, Int32 [] aWrapperTypes, MessageData и msgData)
Хотя у меня есть обходной путь, он беспорядочный и помещает много тестового кода в реальный проект, а не в тестовый проект, что на самом деле не так, как должен работать NUnit.