2016-11-17 3 views
0

Der Code verspottet werden, sieht wie folgt aus:Wie kann ich einen Moq-Mock einrichten, um ein Ereignis zu erzeugen, das in einer Implementierung der Schnittstelle definiert wurde und nicht die Schnittstelle selbst?

class Foo : IBar 
{ 
    public virtual event EventHandler FooEventHandler; 

    void FooMethod() 
    { 
     // blah, blah, blah... 
    } 

    void IBar.BarMethod() 
    { 
     this.FooEventHandler?.Invoke(this, new EventArgs()); 
    } 
} 

interface IBar 
{ 
    void BarMethod(); 
} 

I Foo und seine Umsetzung von IBar verspotten wollen, so dass ich es um das Thema zu prüfenden Hand und geltend zu machen. Anforderungen sagen mir, dass ich den Event-Handler nicht auf die IBar-Schnittstelle setzen darf, also scheint the explanation behind this link für mich nicht zu funktionieren.

Antwort

0

Weil ich mit der Mock.As<T>() Methode zu tun habe das gleiche Objekt wie zwei verschiedene Schnittstellen verweisen ich, dass ich zu .As<T> in einen IBar Kontext von Foo Setup benötigt wusste, dass die explizit IBar.BarMethod() umgesetzt, aber dann musste ich den IBar Kontext halten des Setups, während Zugriff auf Foo.FooEventHandler erhalten, um an die .Raises(Action<T> eventExpression, EventArgs args) übergeben. Also, ich spiralförmig .As<T> mein Weg nach unten in den Foo-Kontext von IBar, so dass Foo.FooEventHandler in eine Action<IBar>.

[TestMethod] 
public void FooEventRaisedByIBarImplementation() 
{ 
    var foo = new Mock<Foo>(); 
    foo.As<IBar>().Setup(bar => bar.BarMethod()) 
      .Raises(bar => bar.As<Foo>().FooEventHandler += null, new EventArgs()); 
} 
Verwandte Themen