Решение этой ошибки ускользнуло меня на несколько дней, и пришло время прийти за помощью. Короткий вариант: у меня есть единичный тест, который терпит неудачу на сервере сборки, но нет другой среды.Ошибка при проверке NUnit при запуске через CC.NET
Метод, который я тестирую, является методом расширения для ILog в log4net. Цель этого метода расширения - сделать журнал отладки текущего метода при вызове и использовать его для отладки. Код для этого довольно прост.
public static void MethodHead(this ILog log, params object[] parameters)
{
/* Assert */
log.AssertNonNull();
/* Since this is an expensive operation, don't do it if Debug is not enabled */
if (log.IsDebugEnabled)
{
StackTrace stackTrace = new StackTrace();
/* Get calling method */
MethodBase method = stackTrace.GetFrame(1).GetMethod();
string logMessage = string.Format("{0}.{1}({2})", method.DeclaringType.Name, method.Name, parameters.ToDelimitedString(", "));
log.Debug(logMessage);
}
}
В этом методе я проверяю этот режим отладки включен, потому что я не хочу делать StackTrace, если ничего не предполагается, чтобы войти (из-за проблем с производительностью). Когда я тестирую этот метод, я буду использовать Rhino Mocks, чтобы издеваться над интерфейсом ILog и позволить IsDebugEnabled возвращать true.
Рассмотрите следующий метод тестирования NUnit.
Это хорошо работает в моей среде разработки, Visual Studio 2008 с TestDriven.NET. Он отлично работает, если я запускаю тест через nunit-console.exe или nunit-gui. Он даже работает хорошо, если я использую свой скрипт NAnt для выполнения теста.
Однако мой сервер сборки не прошел этот тест, когда он проходит через NAnt, который выполняется с CruiseControl.NET. Когда я запускаю его вручную с помощью nunit-console.exe на сервере сборки, он преуспевает.
Ошибка и трассировка стека следующие.
Rhino.Mocks.Exceptions.ExpectationViolationException : ILog.Debug("**<>c__DisplayClass8.<MethodHeadShouldLogCurrentMethodNameWithArguments>b__5**(CAT, IN, A, HAT)"); Expected #0, Actual #1.
ILog.Debug("MethodHeadTest.CallingMethod(CAT, IN, A, HAT)"); Expected #1, Actual #0.
at Rhino.Mocks.MethodRecorders.UnorderedMethodRecorder.DoGetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.MethodRecorders.MethodRecorderBase.GetRecordedExpectation(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.ReplayMockState.DoMethodCall(IInvocation invocation, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.ReplayMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args)
at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args)
at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation)
at Castle.DynamicProxy.AbstractInvocation.Proceed()
at ILogProxy86e676a4761d4509b43a354c1aba33ed.Debug(Object message)
at Vanilla.Extensions.LogExtensions.MethodHead(ILog log, Object[] parameters) in d:\Build\Mint\WorkingDirectory\Source\Main\Vanilla\Extensions\LogExtensions.cs:line 42
at Vanilla.UnitTests.Extensions.LogExtensions.MethodHeadTest.<>c__DisplayClass8.<MethodHeadShouldLogCurrentMethodNameWithArguments>b__5() in d:\Build\Mint\WorkingDirectory\Source\Test\Vanilla.UnitTests\Extensions\LogExtensions\MethodHeadTest.cs:line 99
at Rhino.Mocks.With.FluentMocker.Verify(Proc methodCallsToBeVerified)
at Vanilla.UnitTests.Extensions.LogExtensions.MethodHeadTest.MethodHeadShouldLogCurrentMethodNameWithArguments() in d:\Build\Mint\WorkingDirectory\Source\Test\Vanilla.UnitTests\Extensions\LogExtensions\MethodHeadTest.cs:line 90
Таким образом, проблема заключается в том, что сервер сборки считает, что этот метод имеет другое (динамическое?) Имя. Вернее, это Rhino Mocks делает это предположение?
Я не получаю нигде с этой ошибкой, так как не могу воссоздать ее на моей машине разработки. Я рад за весь вход, который я могу получить.
Спасибо!
Микаэль Лундин