Я пишу серверный компонент на C# и использую Pex для unittesting.Pex повышает исключение NullReferenceException при изучении
У меня сложный параметризованный модульный тест для определенного метода. Теперь выясняется, что, как только я добавляю определенный блок assert, некоторые pex-поисковые прогоны возникают с ошибкой NullReferenceException на закрывающей строке моего метода (прямо в скобке). Когда я отлаживаю неудачный прогон, он работает абсолютно нормально.
Я совершил ошибку или это ошибка в pex?
Спасибо!
[PexMethod]
public Task Start(CancellationToken cancellationToken,
int workingEndpoints, // endpoints that run succesfully
int failingEndpoints, // endpoints that fail immidiatly
int brokenEndpoints) // endpoints that return null for their task
{
PexAssume.IsTrue(workingEndpoints >= 0);
PexAssume.IsTrue(failingEndpoints >= 0);
PexAssume.IsTrue(brokenEndpoints >= 0);
PexAssume.IsTrue(workingEndpoints + failingEndpoints + brokenEndpoints >= 1);
// create fake endpoints based on the count
List<IHostEndpoint> fakeEndpoints = new List<IHostEndpoint>();
Exception failedTaskException = new Exception();
// Create a few endpoint stubs for testing purposes and add them to the list (commented away for relevance)
// create and start the host
Host host = new Host(fakeEndpoints.ToArray());
Task result = host.Start(cancellationToken);
PexAssert.IsNotNull(result);
if (failingEndpoints > 0 || brokenEndpoints > 0)
{
PexAssert.IsNotNull(result.Exception);
int failedEndpointExceptionCount = 0;
int brokenEndpointExceptionCount = 0;
result.Exception.Flatten().Handle(innerException =>
{
if (innerException == failedTaskException)
failedEndpointExceptionCount++;
else
brokenEndpointExceptionCount++;
return true;
});
// after one broken endpoint, the run method should stop starting more endpoints
int brokenEndpointExpectedCount = Math.Min(1, brokenEndpoints);
PexAssert.AreEqual(failedEndpointExceptionCount, failingEndpoints);
PexAssert.AreEqual(brokenEndpointExceptionCount, brokenEndpointExpectedCount);
}
return result;
}
EDIT
Одно предположение может быть, что из-за асинхронный код, Pex сталкивается с некоторыми проблемами. Я проверил каждый прогон и даже подделал метод запуска хоста. Нет асинхронных методов. Я создать 1 задачу в некоторых случаях, но я запустить его синхронно (доказательство ниже)
Task endpointTask = endpoint.Start(innerCancellationToken);
if (endpointTask == null)
{
// This endpoint is broken, for simplicity we raise an exception in the normal pipe
Task faultedTask = new Task(() =>
{
throw new InvalidOperationException("Endpoint returned a null valued task which is not allowed");
});
faultedTask.RunSynchronously();
innerTasks.Add(faultedTask);
break;
}
else
{
innerTasks.Add(endpointTask);
}
заглушки IHostEndpoint создаются с помощью TaskCompletionSource со значением/состоянием непосредственно установлен.
Что такое трассировка стека? – SLaks
System.NullReferenceException: Ссылка на объект не установлена в экземпляр объекта. c: \ users \ koen \ documents \ visual studio 2010 \ Projects \ ManagedHttp \ ManagedHttp.Tests \ HostTest.cs (98): в System.Threading.Tasks.Task ManagedHttp.HostTest.Start (System.Threading.CancellationToken cancelationToken, System .Int32 workingEndpoints, System.Int32 failingEndpoints, System.Int32 brokenEndpoints) Строка 98 - это строка, содержащая закрывающий скобок метода – Polity
Какая строка в коде, который вы опубликовали, соответствует>? – ChrisF