2011-08-16 53 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