2010-09-26 2 views
4

Я получаю сообщение об ошибке (см. Нижнюю часть сообщения) при запуске NUnit против сборки производственного кода. Узел производственного кода имеет ссылку на стороннюю структуру, которая использует log4net внутри себя (в частности, это SDK SimplyAccounting). Версия log4net, которую он использует, - 1.2.9.0. Вне этой сторонней структуры, которую мы используем через public api из DLL-файлов, log4net не является частью нашего производственного кода.log4Net проблемы с NUnit (Tried v2.5.7, 2.5.2, 2.4.8, 2.4.7)

При устранении неполадок я исключил ссылку на сборку производственного кода из тестового проекта блока и добавил ссылку на SDK SimplyAccounting. Когда я это делаю, 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 для проблем внутренней совместимости (что-то я узнал после выполнения поиска в Google). Итак, почему 2.5.2 использует log4net? Я попробую 2.4.8 или 2.4.7, чтобы посмотреть, смогу ли я все работать. – Matt

+0

Нет! NUnit 2.4.7 и 2.4.8 все еще дают мне проблемы log4Net. То же самое касается 2.5.7 (последняя версия). – Matt

+0

является проблемой, если вы отключите ведение журнала ''? – k3b

ответ

2

Одно решение (хотя довольно разрушительными и не решить корень проблемы) будет иметь свое сборочное производство поговорить с интерфейсом, который оборачивает SimplyAccount SDK вместо того, чтобы говорить непосредственно к нему. Тогда вашему производственному коду не нужно ссылаться на dll SDK, и вы можете свободно его протестировать, передав фальшивый интерфейс созданного вами интерфейса.

У этого есть преимущество в дизайне от развязки от этого SDK, но, как я уже сказал, он может быть довольно разрушительным для вашей кодовой базы.

Смежные вопросы