2012-04-10 3 views
1

Я пишу серверный компонент на 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 со значением/состоянием непосредственно установлен.

+0

Что такое трассировка стека? – SLaks

+0

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

+0

Какая строка в коде, который вы опубликовали, соответствует>? – ChrisF

ответ

0

Pex - фантастический инструмент, но у него есть ошибки. Из ваших утверждений я могу сказать, что это ошибка в Pex: добавление assert не должно вызывать несвязанный NullRef. Я предлагаю вам сообщить об этом на форумах Pex.

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