有没有人对 Office 托管应用程序加载项进行单元测试有任何建议?我正在使用 NUnit,但我在使用 MSTest 时遇到了同样的问题。
问题是在 Office 应用程序(在我的例子中是 Word)中加载了一个 .NET 程序集,我需要一个对 .NET 程序集实例的引用。我不能只实例化该对象,因为它不会有 Word 的实例来做事。
现在,我可以使用 Application.COMAddIns("Name of addin").Object 接口来获取引用,但这会得到一个通过 RequestComAddInAutomationService 返回的 COM 对象。到目前为止,我的解决方案是让该对象为我想要测试的真实 .NET 对象中的每个方法都有代理方法(全部在条件编译下设置,因此它们在发布的版本中消失)。
COM 对象(一个 VB.NET 类)实际上具有对真实加载项实例的引用,但我尝试将其返回给 NUnit,但我得到了一个不错的 p/Invoke 错误:
System.Runtime.Remoting.RemotingException :此远程代理没有通道接收器,这意味着服务器没有注册的服务器通道正在侦听,或者此应用程序没有合适的客户端通道与服务器通信。在 System.Runtime.Remoting.Proxies.RemotingProxy.InternalInvoke(IMethodCallMessage reqMcmMsg, Boolean 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(字符串成员名称、BindingFlags 标志、对象目标、Int32 [] aWrapperTypes、MessageData 和 msgData)
虽然我有一个变通办法,但它很混乱,并且将大量测试代码放在真实项目而不是测试项目中——这并不是 NUnit 真正的工作方式。