メッセージボックスのテスト(Windows.Forms)

先々週末に腰を怪我して自宅療養中のmasakitkです。
そういえばメッセージボックスのテストについては、一部分だけを追記しただけで、NUnitFormTestを継承してる部分とか何も説明していなかったので、http://d.hatena.ne.jp/masakitk/20111218/1324234876で作ったgithubリポジトリにテストを追加しました。
ちょっとテストもリファクタしてます。

テストコードはこんな感じになりました。

using System.Windows.Forms;
using NUnit.Extensions.Forms;
using NUnit.Framework;
using TddFizzBuzz;

namespace TddFizzBuzzTest
{
    [TestFixture]
    public class TddFizzBuzzTest : NUnitFormTest
    {
        [Test]
        public void Test01_10までのFizzBuzz結果の確認()
        {
            var target = new FizzBuzzForm();
            target.Show();

            new TextBoxTester("maxNumberTextBox", target).Enter("10");
            new ButtonTester("fizzBuzzButton", target).Click();
            var dataGrid = new Finder<DataGridView>("fizzBuzzDataGridView", target).Find();

            var expectedList = new[] {
                new { Number = 1, Text = "1" },
                new { Number = 2, Text = "2" },
                new { Number = 3, Text = "Fizz" },
                new { Number = 4, Text = "4" },
                new { Number = 5, Text = "Buzz" },
                new { Number = 6, Text = "Fizz" },
                new { Number = 7, Text = "7" },
                new { Number = 8, Text = "8" },
                new { Number = 9, Text = "Fizz" },
                new { Number = 10, Text = "Buzz" },
            };

            foreach (var expected in expectedList)
                AssertForOneRow(dataGrid, expected.Number, expected.Text);
        }

        [Test]
        public void Test02_数値以外の入力時をチェックしているか()
        {
            バリデーションメッセージ確認("aaa", "1以上の数値を入力してください。");
            バリデーションメッセージ確認("01a", "1以上の数値を入力してください。");
        }

        [Test]
        public void Test03_0以下の入力時をチェックしているか()
        {
            バリデーションメッセージ確認("0", "1以上の数値を入力してください。");
            バリデーションメッセージ確認("-3", "1以上の数値を入力してください。");
        }

        private void バリデーションメッセージ確認(string text, string message)
        {
            var target = new FizzBuzzForm();
            target.Show();

            DialogBoxHandler = (title, handle) =>
            {
                var messageBox = new MessageBoxTester(handle);
                Assert.That(messageBox.Text, Is.EqualTo(message));
                messageBox.ClickOk();
            };

            new TextBoxTester("maxNumberTextBox", target).Enter(text);
            new ButtonTester("fizzBuzzButton", target).Click();
        }

        private static void AssertForOneRow(DataGridView dataGrid, int rowIndex, string expected)
        {
            Assert.That(dataGrid["FizzBuzzValue", ToZeroBased(rowIndex)].Value, Is.EqualTo(expected));
        }

        private static int ToZeroBased(int rowIndex)
        {
            return rowIndex - 1;
        }
    }
}


デブサミも1日半参加したんだけど、まだレポート書いてないや。
(一応メモとったノートが会社にあるからという言い訳)
Jenkins勉強会は補欠から繰り上がったけど腰の怪我のため参加できず。