Пекс вызывает NullReferenceException при исследовании
Я пишу серверный компонент на C# и использую Pex для тестирования юнитов.
У меня сложный параметризованный модульный тест для конкретного метода. Теперь оказалось, что, как только я добавляю определенный блок 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;
}
РЕДАКТИРОВАТЬ
Одно из предположений может заключаться в том, что из-за асинхронного кода 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 с прямым значением значения / состояния.
1 ответ
Pex - фантастический инструмент, но в нем есть ошибки. Из ваших утверждений я могу сказать, что это ошибка в Pex: добавление assert не должно вызывать несвязанный NullRef. Я предлагаю вам сообщить об этом на форумах Pex.