2016-02-27 53 views
0

這裏是我的方法的一個代碼,我想測試:如何打破依賴StreamReader的readLine()方法的微軟假貨單元測試?

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循環中進入。 只要它在while循環中輸入,sr.ReadLine()就會一直返回「completed」。所以我被困在這裏。我將如何在這裏停下來,或者如何編寫輸入字符串,以便在第二次調用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運行到無限循環。 :)乾杯謝謝:) –