C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/12/18 12:57
こんなクラスがあったとします。
public class Hoge
{
    public Fuga F = new Fuga();
}

public class Fuga
{
    public int V = 0;
}


更にこんなクラスがあったとします。
public class Foo
{
    public Piyo(IBar bar)
    {
        this._bar = bar;
    }
    private _bar;
    public void AAA()
    {
        Hoge h = new Hoge();
        h.F.V = 10;
        this._bar.BBB(h);
    }
}

public interface IBar
{
    void BBB(Hoge h);
}


Foo.AAA メソッドは IBar.BBB メソッドに h (Hoge オブジェクト) を渡しています。
この時、h.F.V に 10 を設定しています。

このことを、NUnit の DynamicMock を使って検証するには、次のような方法が取れます。

using NUnit.Framework;
using NUnit.Framework.Constraints;
using NUnit.Framework.SyntaxHelpers;
using NUnit.Mocks;

[TestFixture]
public class TestFixture1
{
    [Test]
    public void Test1()
    {
        DynamicMock barMockery = new DynamicMock(typeof(IBar));
        Foo foo = new Foo((IBar)barMockery.MockInstance);

        barMockery.Strict = true;
        // BBB メソッドが受け取った Hoge オブジェクトの F プロパティ値の V プロパティ値が 10 であることを期待。
        barMockery.Expect("BBB",
            new PropertyConstraint("F",
                new PropertyConstraint("V",
                    Is.EqualTo(10))));
        foo.AAA();
        barMockery.Verify();
    }
}


Has.Property メソッドを使用するのではなく、PropertyConstraint オブジェクトを直接生成するのがポイントです。

DynamicMock.Expect メソッド (の第2引数) は Constraint が渡されることも想定した作りになっていますが、Has.Property メソッド (の第2引数) はこれを想定した作りにはなっていません。
なので、xxx.yyy.zzz というように、プロパティ値のプロパティ値を検証するには Has.Property メソッドが使えないわけです。
スポンサーサイト