【发布时间】:2008-09-24 11:09:22
【问题描述】:
有没有人对 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,布尔值 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 真正的工作方式。
【问题讨论】: