2011-08-16 45 views
-3

我有以下方法,我想對其執行單元測試。可以對方法簽名進行更改:如何使用C#測試此方法

public void PrintNumber() 
{ 
    Enumerable.Range(1, 100).ToList().ForEach(x => 
    { 
     if (x % 3 == 0 && x % 5 == 0) 
      Console.WriteLine("[35]"); 
     else if (x % 3 == 0) 
      Console.WriteLine("[3]"); 
     else if (x % 5 == 0) 
      Console.WriteLine("[5]"); 
     else 
      Console.WriteLine(x.ToString()); 
    }); 
} 

我有我自己的解決方案,但我想知道我的版本是否最好。

謝謝!

+1

你想讓我們爲你寫測試嗎?你有什麼嘗試? – Amy

+4

因爲它已經寫好了,所以你不能真的TDD這個方法;在TDD中,你先寫測試。然而你可以爲它編寫一個單元測試。 –

+0

你是什麼意思,TDD測試? –

回答

8

爲了進行單元測試這種方法,你需要來包裝你Console.WriteLine()一個代理類,並將該類注入到您的方法中。

public interface IWriter 
{ 
    void Write(string text); 
} 

public class ConsoleWriter : IWriter 
{ 
    public void Write(string text) 
    { 
     Console.WriteLine(text); 
    } 
} 

public class StubWriter : IWriter 
{ 
    List<string> values = new List<string>(); 
    public void Write(string text) 
    { 
     values.Add(text); 
    } 

    public List<string> Values { get { return values; } } 
} 

採用這種結構你改變你的方法簽名PrintNumber(IWriter writer)並調用作家。在您的測試方法中,您注入StubWriter,在生產中注入ConsoleWriter

+0

+1,儘管我不認爲OP會把時間都花在解決這個問題上......再加上+1是因爲我不認爲OP會將這些標記標記爲答案... –

+0

是的,當然他不會理解這和它可能看起來有點不同,理解這個我猜:) Btw很好的答案。 – Zenwalker

+0

@Charles Graham謝謝你的解決方案。我有我自己的解決方案,但我想知道我的版本是否最好。 – Pingpong

1

如果您指的是單元測試,您只能驗證輸出,因爲該方法沒有輸入。我會重寫簽名爲:

public void PrintNumber(TextWriter writer) // use writer.WriteLine instead of console.WriteLine 

然後在測試中傳遞類似StreamWriter的東西掛鉤到MemoryStream。在從測試方法中調用方法之後,應該將輸出寫入到MemoryStream中,並且可以驗證它是否生成了您所期望的輸出。

編輯:被忽視的添加,在生產中,如果你真的希望它寫入控制檯,叫它如下:

PrintNumber(Console.Out); 
2

下面就來重寫你的方法

public void PrintNumber(TextWriter writer, 
       Action<TextWriter, int> modHandler) {... } 

public void HandleMod(TextWriter writer, int input) {...} 

而且一些測試方式:

void Print_Number_Should_Enumerate_0to100 {...} 
void Handle_Mod_Outputs_35_Only_When_Input_35 {...} 
void Handle_Mod_Gets_Mod_3_Correct {...} 
void Handle_Mode_Gets_Mod_5_Correct {...} 
void Handle_Mode_Defaults_To_Outputting_Input {...} 

等。

但是,你不能TDD這個 - 它已經寫好了。 TDD涉及先寫測試。你可以做的是寫測試,然後重構使測試工作。

+0

感謝您的建議。 – Pingpong