IEnumerable и доходность - PullRequest
       30

IEnumerable и доходность

0 голосов
/ 21 января 2010

Мои модульные тесты делают что-то очень странное, когда я вызываю метод базового базового типа. Я пробовал и NUnit и MSTest с тем же результатом. Вот как организован код:

public class MyStub {}

public class EnumerableGenerator
{
     public bool GotMyStubs;

     public IEnumerable<MyStub> GetMyStubs()
     {
         GotMyStubs = true;
         yield return new MyStub();
     }
}
public class ConsoleRunner
{
public void Main(string args[])
{
     EnumerableGenerator gen = new EnumerableGenerator();
     gen.GotMyStubs = false;
     var myStubs = gen.GetMyStubs();
     if  (!gen.GotMyStubs)
         return 1;
} 
}

Тест не пройден, очевидно. Странная часть в том, что код работает нормально, когда я тестирую интеграцию. Это только перерывы в модульном тесте. Я не могу войти в GetMyStubs вообще. Точки разрыва в методе также не ломаются. Я включил взлом для всех исключений, генерируемых CLR, и это также ничего не дает.

Я проверил тип, возвращаемый GetMyStubs, и полное имя типа выглядит следующим образом:

[MyNamespace.EnumerableGenerator2 + <GetMyStubs> d__8 [[MyNamespace.MyStub, MyNamespace, версия = 7.1.0.0, культура = нейтральная, PublicKeyToken = ноль]]

Теперь, когда я смотрю на свои номера покрытия кода (через MSTest), я замечаю, что есть запись EnumerableGenerator.d__8.

Кто-нибудь видел что-то подобное? Я полностью потерян ....

1 Ответ

3 голосов
/ 21 января 2010

Код, который вы дали, даже не скомпилируется - в IEnumerable<T> отсутствует свойство Count. Есть Count() метод расширения - это то, что вы имели в виду?

Я сильно подозреваю, что MyMethod() не действительно тоже не выглядит так. Я подозреваю, что он на самом деле использует yield return для возврата элементов ... в этот момент имеет смысл полное имя типа, поскольку это конечный автомат, сгенерированный для вас блоком итератора.

Предполагая, что это тот случай, когда вы вызываете MyMethod(), это не выполнит ваш код. Это создаст конечный автомат и вернет его. Когда вы начнете перебирать его, , затем он начнет выполнять ваш код ... и тогда я ожидаю, что будут достигнуты точки останова.

Не могли бы вы привести краткий, но полный пример (с использованием NUnit, если необходимо, но консольное приложение было бы идеально), если он не работает?

...