J'ai récemment dû faire ceci, et voici ce que j'ai trouvé. La raison pour laquelle je n'ai pas fait ce que disaient les autres posts, c'est que je n'aime pas l'idée d'un état de conservation des variables et de devoir le réinitialiser "manuellement" entre plusieurs événements.
est Ci-dessous le code de l'événement avec ClassUnderTest
NameChanged
qui est testé dans MyTests
essais:
public class ClassUnderTest {
private string name;
public string Name {
get { return this.name; }
set {
if (value != this.name) {
this.name = value;
NameChanged(this, new PropertyChangedEventArgs("Name"));
}
}
}
public event EventHandler<PropertyChangedEventArgs> NameChanged = delegate { };
}
[TestFixture]
public class MyTests {
[Test]
public void Test_SameValue() {
var t = new ClassUnderTest();
var e = new EventHandlerCapture<PropertyChangedEventArgs>();
t.NameChanged += e.Handler;
Event.Assert(e, Event.IsNotRaised<PropertyChangedEventArgs>(),() => t.Name = null);
t.Name = "test";
Event.Assert(e, Event.IsNotRaised<PropertyChangedEventArgs>(),() => t.Name = "test");
}
[Test]
public void Test_DifferentValue() {
var t = new ClassUnderTest();
var e = new EventHandlerCapture<PropertyChangedEventArgs>();
t.NameChanged += e.Handler;
Event.Assert(e, Event.IsPropertyChanged(t, "Name"),() => t.Name = "test");
Event.Assert(e, Event.IsPropertyChanged(t, "Name"),() => t.Name = null);
}
}
Les classes de soutien sont ci-dessous. Les classes peuvent être utilisées avec n'importe quel EventHandler<TEventArgs>
ou étendues à d'autres délégués. Les tests d'événement peuvent être imbriqués.
/// <summary>Class to capture events</summary>
public class EventHandlerCapture<TEventArgs> where TEventArgs : EventArgs {
public EventHandlerCapture() {
this.Reset();
}
public object Sender { get; private set; }
public TEventArgs EventArgs { get; private set; }
public bool WasRaised { get; private set; }
public void Reset() {
this.Sender = null;
this.EventArgs = null;
this.WasRaised = false;
}
public void Handler(object sender, TEventArgs e) {
this.WasRaised = true;
this.Sender = sender;
this.EventArgs = e;
}
}
/// <summary>Contains things that make tests simple</summary>
public static class Event {
public static void Assert<TEventArgs>(EventHandlerCapture<TEventArgs> capture, Action<EventHandlerCapture<TEventArgs>> test, Action code) where TEventArgs : EventArgs {
capture.Reset();
code();
test(capture);
}
public static Action<EventHandlerCapture<TEventArgs>> IsNotRaised<TEventArgs>() where TEventArgs : EventArgs {
return (EventHandlerCapture<TEventArgs> test) => {
NUnit.Framework.Assert.That(test.WasRaised, Is.False);
};
}
public static Action<EventHandlerCapture<PropertyChangedEventArgs>> IsPropertyChanged(object sender, string name) {
return (EventHandlerCapture<PropertyChangedEventArgs> test) => {
NUnit.Framework.Assert.That(test.WasRaised, Is.True);
NUnit.Framework.Assert.That(test.Sender, Is.SameAs(sender));
NUnit.Framework.Assert.That(test.EventArgs.PropertyName, Is.EqualTo(name));
};
}
}
bonne prise! Je mettrais à jour ma réponse mais il n'y a pas grand chose à dire car c'est vraiment une dup de la réponse de Dror de toute façon – theburningmonk