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 メソッドが使えないわけです。