有人对Office托管应用程序外接程序的单元测试有什么建议吗?我正在使用NUnit,但我在使用MSTest时也遇到了同样的问题。
问题是在Office应用程序(在我的例子中是Word)中加载了一个.NET程序集,我需要对该.NET程序集实例的引用。我不能只是实例化对象,因为它不会有Word的实例来做事情。
现在,我可以使用Application.COMAddIns(“插件名称”).Object接口来获取引用,但这会为我获取通过RequestComAddInAutomationService返回的COM对象。到目前为止,我的解决方案是,让该对象为我想要测试的真实.NET对象中的每个方法都有代理方法(所有这些方法都是在条件编译下设置的,这样它们就会在发布的版本中消失)。
COM对象(一个VB.NET类)实际上有一个对实际外接程序实例的引用,但我尝试将其返回到NUnit,得到了一个很好的p/Invoke错误:
System.Runtime.Remoting.RemotingException : This remoting proxy has no channel sink which means either the server has no registered server channels that are listening, or this application has no suitable client channel to talk to the server. at System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, Boolean useDispatchMessage, Int32 callType) at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
我尝试使主加载项COM可见,但错误发生了更改:
System.InvalidOperationException : Operation is not valid due to the current state of the object. at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
虽然我有一个变通办法,但它很混乱,并将大量测试代码放在实际项目中,而不是测试项目中——这并不是NUnit真正的工作方式。