2010-08-08 2 views
0

Я пытаюсь выполнить тест NUnit, добавляя элемент в коллекцию из нового потока. Это тестовая функция, которую я использую:Ошибка NUnit при индексе -1

[Test] 
public void WorkerThreadAccess() 
{ 
    string foo = "Foo"; 
    Collection<string> collection = new Collection<string>(); 
    System.Threading.Thread thread = 
       new System.Threading.Thread(() => collection.Add(foo)); 
    thread.Start(); 

    Collection<string> expected = new Collection<string> { foo }; 
    System.Threading.Thread.Sleep(0); 
    CollectionAssert.AreEqual(expected, collection); 
} 

Когда я запускаю тест один раз, он проходит. Однако на каждое последующем испытание без закрытия GUI NUnit, NUnit выходит из строя Утверждай со странной ошибкой:

Expected and actual are both <System.Collections.ObjectModel.Collection 1[System.String]`> with 1 elements
Values differ at index [0]
String lengths are both 3. Strings differ at index -1.
Expected: "Foo"
But was: "Foo"

Может кто-нибудь дать некоторое понимание того, что происходит не так? Элементы выглядят одинаково для меня, а индекс -1 должен возвращаться только при ошибке IndexOf().

EDIT: Я использую NUnit 2.5.7

ответ

1

попытка заменить System.Threading.Thread.Sleep(0); с thread.Join();

То, что вы на самом деле хотите, чтобы ждать второго потока, чтобы завершить, а не только приостановить текущий ,

+0

Это было именно это (и я узнал новый метод). Как вы думаете, вы можете объяснить, почему уступка моего потока вызвала ошибку, если функция дважды вызывалась в процессе? – bsg

+0

'Sleep (0)' просто возвращает управление ОС (или это процессор?), Который выбирает другой поток из своего списка активных потоков. Это никоим образом не означает, что ваш второй поток будет выбран, или что ваш второй поток будет завершен, управление временем будет возвращено в ваш основной поток. Почему запуск его второй раз вызывает ошибку, но не первый? Не знаю ... Какое-то распределение ресурсов/компиляция/магические накладные расходы вуду, влияющие на первое исполнение, возможно? Но ясно, что ваша 'коллекция' по-прежнему изменяется, когда' CollectionAssert.AreEqual (ожидается, коллекция); 'выполняется. –

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