コンソールの場合、私は常にそれを自分の実装でラップします。
単体テストに関係するすべてのサードパーティコントロールにラッパーとインターフェイスを使用すると、分離フレームワーク(Rhino Mocksなど)の操作が非常に簡単になります。これにより、テストを制御でき、コードの依存関係を明示的に定義できます。コンソールの新機能が必要なので、ラッパーインターフェイスに追加するだけです。インターフェイスの肥大化に関する問題はまだ発生していません...
public interface IConsoleShim
{
void WriteLine(string message);
ConsoleKeyInfo ReadKey();
}
public class ConsoleShim : IConsoleShim
{
public void WriteLine(string message)
{
Console.WriteLine(message);
}
public ConsoleKeyInfo ReadKey()
{
return Console.ReadKey();
}
}
これが実際のテストです
[NUnit.Framework.Test]
public void Run_writes_to_console_100_times_waits_for_keypress()
{
// arrange
Rhino.Mocks.MockRepository mocks = new Rhino.Mocks.MockRepository();
IConsoleShim consoleMock = mocks.StrictMock<IConsoleShim>();
Program program = new Program(consoleMock);
int expected = 100;
// VerifyAll automatically called
Rhino.Mocks.With.Mocks(mocks).Expecting(() =>
{
Rhino.Mocks.Expect.Call(() => consoleMock.WriteLine("")).IgnoreArguments().Repeat.Times(expected);
Rhino.Mocks.Expect.Call(consoleMock.ReadKey()).Return(new ConsoleKeyInfo());
});
//act
program.Run();
}