3

2つのインターフェースでMoqを使用しているOuterInner、発砲できませんOuter.Inner.SomeEvent

public interface Outer
{
    Inner Inner { get; }
}

public interface Inner
{
    int Prop { get; set; }
    event EventHandler PropChanged;
}

public void Test()
{
    Mock<Outer> omock = new Mock<Outer>();
    Mock<Inner> imock = new Mock<Inner>();

    Console.WriteLine("Inner");
    imock.Object.PropChanged += InnerPropChanged;
    imock.Raise(m => m.PropChanged += null, EventArgs.Empty);
    imock.Object.PropChanged -= InnerPropChanged;

    // This has no effect.
    //omock.Setup(m => m.Inner).Returns(imock.Object);

    Console.WriteLine("Outer");
    // Both the auto recursive and the explicit above produce the same behavior.
    omock.SetupProperty(m => m.Inner.Prop, -1);
    omock.Object.Inner.PropChanged += InnerPropChanged;
    omock.Raise(m => m.Inner.PropChanged += null, EventArgs.Empty);
}

public void InnerPropChanged(object sender, EventArgs e)
{
    Console.WriteLine("  InnerPropChanged");
}

呼び出し時の出力Test()

Inner
  InnerPropChanged
Outer

Innerサブスクライバーにのイベントを警告するにはどうすればよいですか?何もそれらを発射することができないようです。

Inner編集-明確にするために、コンテキストからイベントを発生させることができるようにしたいOuterので、最終的な出力には次のものを含める必要があります。

Outer
  InnerPropChanged
4

1 に答える 1

1

多分それは式がバグまたは欠落している機能です

omock.Raise(m => m.Inner.PropChanged += null, EventArgs.Empty);

は機能していません...ただし、生成されたInnerモックを取得しMock.Getて、イベントを発生させることができます。

public void Test()
{
    Mock<Outer> omock = new Mock<Outer>();
    Console.WriteLine("Outer");
    omock.SetupProperty(m => m.Inner.Prop, -1);
    omock.Object.Inner.PropChanged += InnerPropChanged;
    Mock.Get(omock.Object.Inner)
        .Raise(m => m.PropChanged += null, EventArgs.Empty);
}

これにより、目的の出力が生成されます。

Outer
  InnerPropChanged
于 2013-01-17T20:22:31.880 に答える