2016-02-27 6 views
0

Вот мой код в одном из метода, который я хочу, чтобы тест:Как разорвать зависимость от метода readLine() StreamReader в модульном тестировании подсистемы microsoft?

using (var sr = new StreamReader(myFile)) 
     { 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       if (line.Equals("completed")) 
       { 
        continue; //here it is getting called infinite times 
       } 

       if(line.Equals("processed")) 
       { 
        break; 
       } 
      } 
     } 

В моем методе испытаний я написал ниже код с помощью регулировочной шайбы:

  ShimStreamReader.ConstructorString = delegate (StreamReader @this, string @string) 
      { 
       var reader = new ShimStreamReader(@this); 
       reader.ReadLine =() => 
       { 
        return "completed"; 
       }; 
      }; 

Теперь я не хочу для передачи файла. Вместо этого я хочу передать поток символов или строку. Вышеуказанный тестовый код вызывает и ломает зависимость нового StreamReader (myFile) как ожидалось и входит в цикл while. Как только он вводит его во время цикла, sr.ReadLine() возвращается «завершено» все время. Поэтому я застрял здесь. Как бы я остановился здесь или как написать строку ввода так, чтобы как только мой первый вызов был завершен во втором вызове sr.ReadLine(), он должен вернуть значение null, а затем разбить цикл?

ответ

0

Здесь вы скорее задаете общий вопрос кодирования, чем подделки. Все, что вам нужно сделать, это добавить флаг и установить его, когда вы готовы закончить ввод. Это код, который я использовал

private bool _lineSent = false; 

    [TestMethod] 
    public void ReaderTest() 
    { 
     using (ShimsContext.Create()) 
     { 
      ShimStreamReader.ConstructorString = (reader, s) => 
      { 
       ShimStreamReader shimReader = new ShimStreamReader(reader); 
       shimReader.ReadLine =() => 
       { 
        if (!_lineSent) 
        { 
         _lineSent = true; 
         return "completed"; 
        } 
        else 
        { 
         return null; 
        } 
       }; 
      }; 

      ClassToTest testInstance = new ClassToTest(); 
      testInstance.ReadStream(); 
     } 
    } 

Кстати, в зависимости от вашего уровня и то, что вы пытаетесь узнать, вы можете захотеть взглянуть на инъекции зависимостей и с помощью заглушек, а затем регулировочные шайбы. Прокладки удобны и приятны, но для новой разработки и кода под вашим контролем, попробуйте использовать заглушки.

+0

Оцените свои усилия Doobop. Это был поздний ответ, хотя, спасибо большое DooBop. Это может помочь и кому-то. Я реализовал, создал код для создания одного файла с моими ожидаемыми входами и передал его читателю, и тогда я смог проверить свой метод. Передача входных файлов dint выполняется в бесконечный цикл. :) Приветствия Спасибо :) –