2010-09-26 36 views
4

對生產代碼程序集運行NUnit時出現錯誤(請參閱帖子的底部)。生產代碼程序集引用了內部使用log4net的第三方框架(具體來說,這是SimplyAccounting的SDK)。它使用的log4net版本是1.2.9.0。除了我們通過dll文件中的公共API使用的第三方框架之外,log4net不是我們生產代碼的一部分。NUnit的log4Net問題(嘗試版本2.5.7,2.5.2,2.4.8,2.4.7)

在排除故障時,我從單元測試項目中刪除了對生產代碼程序集的引用,並添加了對SimplyAccounting SDK的引用。當我這樣做時,NUnit發現了以下錯誤。如果第三方引用(或生產代碼引用)不在測試項目中,那麼Nunit運行良好。任何有可能發生log4net衝突的解決方法都會很有幫助。我正在使用NUnit 2.5.2。

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object. 
    at log4net.Layout.LayoutSkeleton.get_Header() 
    at log4net.Appender.TextWriterAppender.WriteHeader() 
    at log4net.Appender.TextWriterAppender.set_Writer(TextWriter value) 
    --- End of inner exception stack trace --- 

Server stack trace: 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
    at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) 
    at NUnit.Core.Log4NetCapture.SetAppenderTextWriter(TextWriter writer) 
    at NUnit.Core.Log4NetCapture.StartCapture() 
    at NUnit.Core.TextCapture.set_Enabled(Boolean value) 
    at NUnit.Core.RemoteTestRunner.StartTextCapture(EventListener queue) 
    at NUnit.Core.RemoteTestRunner.BeginRun(EventListener listener, ITestFilter filter) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(RuntimeMethodHandle md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) 
    at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) 

Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
    at NUnit.Core.TestRunner.BeginRun(EventListener listener, ITestFilter filter) 
    at NUnit.Core.ProxyTestRunner.BeginRun(EventListener listener, ITestFilter filter) 
    at NUnit.Util.TestDomain.BeginRun(EventListener listener, ITestFilter filter) 
    at NUnit.Util.TestLoader.RunTests(ITestFilter filter) 
    at NUnit.UiKit.TestSuiteTreeView.RunTests(ITest[] tests, Boolean ignoreCategories) 
    at NUnit.UiKit.TestSuiteTreeView.RunSelectedTests() 
    at NUnit.UiKit.TestTree.RunSelectedTests() 
    at NUnit.Gui.NUnitForm.runButton_Click(Object sender, EventArgs e) 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
+0

此外,我認爲Nunit 2.4.7淘汰了log4net的內部兼容性問題(我做了谷歌搜索後發現的)。那麼爲什麼2.5.2使用log4net?我會嘗試2.4.8或2.4.7,看看我能否讓所有的工作都能正常工作。 – Matt 2010-09-26 02:28:26

+0

不! NUnit 2.4.7和2.4.8仍然給我log4Net的問題。 2.5.7(最新版本)也是如此。 – Matt 2010-09-26 02:46:17

+0

問題仍然threre,如果您禁用日誌記錄'<級別值=「OFF」/>'? – k3b 2011-03-22 10:49:52

回答

2

一個解決方案(雖然很破壞性的,不解決根本問題),將有你的生產組裝談話封裝了SimplyAccount SDK,而不是直接談論它的接口。然後你的生產代碼不需要引用SDK dll,你可以通過傳入你創建的接口的虛假實例來自由地進行測試。

這具有從SDK中分離出來的設計優勢,但正如我所說的那樣,這可能會對代碼庫造成很大的干擾。