20 Stimmen

Moq Verify Ereignisse ausgelöst

class A
{
    event EventHandler Event1;
}
var mock = new Mock<A>();

Wie verifiziere ich, dass Ereignis1 ausgelöst wurde (ohne manuelle Ereignisbehandler / ausgelöste Flaggen zu verwenden)?

33voto

Kaleb Pederson Punkte 44715

Ich bin mir nicht sicher, ob ich wirklich verstehe, warum Sie das fragen. Wenn Sie eine Mock<A> dann kontrollieren Sie den Spott, warum also überprüfen, ob er etwas getan hat, was Sie kontrollieren?

Das heißt, obwohl ich Moqs Raise/Raises verwende, verwende ich immer noch oft ein Flag mit einem Lambda, was ich ziemlich sauber finde:

bool eventWasDispatched = false; // yeah, it's the default
var a = new A();
a.Event1 += () => eventWasDispatched = true;
a.DoSomethingToFireEvent();
Assert.IsTrue(eventWasDispatched);

27voto

Teoman Soygul Punkte 25294
var mock = new Mock<IInterfaceWithEvent>();
mock.Raise(e => e.MyEvent += null, EventArgs.Empty);
mock.VerifyAll();

oder wenn Sie sicherstellen wollen, dass act ein Ereignis auslöst, sollte Ihr Setup wie folgt aussehen:

mock.Setup(foo => foo.Submit()).Raises(f => f.Sent += null, EventArgs.Empty);
// ...
mock.VerifyAll();

0voto

Mardoxx Punkte 4144

Wie wäre es mit etwas wie diesem?

public class MyClass : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
        get => _name;

        set
        {
            _name = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

In Ihren Tests:

// This interface contains signatures which match your event delegates
public interface IPropertyChangedEventHandler
{
    void PropertyChangedHandler(object sender, PropertyChangedEventArgs e);
}

public void WhenSettingNameNotifyPropertyChangedShouldBeTriggered()
{
    // Arrange
    var sut = new Mock<MyClass>();

    var handler = new Mock<IPropertyChangedEventHandler>();
    handler.Setup(o => o.PropertyChangedHandler(sut, new PropertyChangedEventArgs(nameof(MyClass.Name))));

    sut.PropertyChanged += handlerMock.Object.PropertyChangedHandler;

    // Act
    sut.Name = "Guy Smiley";

    // Assert
    handler.Verify();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X