Пекс вызывает 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.

Другие вопросы по тегам