2010年7月5日月曜日

Mole で Mock してみるテスト

以前のポストで、こんなプログラムの Program.Main() について、、、
using System.Windows.Forms;
public class Class1
{
    public string Name { get; set; }
    public Class1(string name)
    {
        this.Name = name;
    }
    public void ShowName()
    {
        MessageBox.Show(Name);
    }
}
class Program
{
    public static void Main(string[] args)
    {
        Class1 class1 = new Class1(args[0]);
        class1.ShowName();
    }
}
、、、以下の観点でホワイトボックス・テストする事を考えた
  1. Main()メソッド内で、引数の先頭要素が Class1 コンストラクタに渡されている事を検証する
  2. 生成した Class1インスタンスの ShowName()メソッドが呼ばれている事を検証する。
  3. 但し、実物の ShowName()は、ユーザインタラクションを含むので呼ばれてはいけない。
前は、Typemockというプロダクトを使ったが、Moleという Microsoft謹製の Mockツールを見つけたので、これでやってみる。
[TestClass]
public class ProgramTest
{
    [TestMethod]
    [HostType("Moles")]
    public void TestMethod1()
    {
        //data
        string expectedName = "abcde";
        // observers
        string actualName = null;
        bool hasShowNameCalled = false;
        //arrange
        MClass1.ConstructorString = (me, name) =>
        {
            actualName = name;
            new MClass1(me)
            {
                ShowName = () => hasShowNameCalled = true
            };
        };
        //act
        Program.Main(new String[] { expectedName });
        //assert
        Assert.AreEqual(expectedName, actualName);
        Assert.IsTrue(hasShowNameCalled);
    }
}

こんな感じですっきり書ける。アトリビュートを見ると分かるとおり、NUnitではなく MS のユニットテストフレームワークを使っている。テストコードだけ見るとTypeMockよりシンプルかもしれない。

ただ *.moles というファイルで、"Mole する"クラス、即ちモックオブジェクトによって本物オブジェクトの呼び出しを迂回させるクラスを、アセンブリと共に指定する事になる。(ここで指定されたアセンブリに対応して、Moleされたクラスを含むアセンブリが VisualStudioによって自動的に生成されて、プロジェクト参照に追加される事になる。)

あと、Typemock と比べて困るのは、Visual Studio の UnitTest 機構と連動させる形じゃないと、いろいろ手間がかかるらしい事。ってか、NUnitと連動させて動かそうとしたけど、全然上手く行っていない。TestDriven.NETとの連携も、果たしてできるのかできないのか何だか良く分からん。

今の現場は VS2008 の standard で、UnitTest が付いてないので、導入は難しそう。そういえば、導入しにくいのは 有料の Typemock もそうだった。

なーんか、.NETって面倒くさ・・・

0 件のコメント:

コメントを投稿