如何在 xunit 中测试引发事件?
How to test in xunit that Event was raised?
我在 class 中定义了这样的简单事件
class Request
{
protected virtual void OnStateChanged()
{
StateChanged?.Invoke(this, EventArgs.Empty);
}
public event EventHandler StateChanged;
public void Approve()
{
OnStateChanged();
}
}
我如何知道这个事件被引发了?
我尝试了一行事件处理程序实现
bool eventRaised = false;
request.StateChanged += (obj, eventArgs) => eventRaised = true;
request.Approve();
Assert.True(eventRaised);
它有效,但有没有更好的方法?没搞明白,怎么用Assert.Raises()
这是通常建议的方法
然而,以下示例显示了如何使用 Assert.Raises()
来测试您提供的 class 的事件
var request = new Request();
var evt = Assert.Raises<EventArgs>(
h => request.StateChanged += h,
h => request.StateChanged -= h,
() => request.Approve());
Assert.NotNull(evt);
Assert.Equal(request, evt.Sender);
Assert.Equal(EventArgs.Empty, evt.Arguments);
但是,您的事件处理程序需要是通用委托
public event EventHandler<EventArgs> StateChanged;
而不只是 EventHandler
,以便 Assert.Raises
按预期工作。
我在 class 中定义了这样的简单事件
class Request
{
protected virtual void OnStateChanged()
{
StateChanged?.Invoke(this, EventArgs.Empty);
}
public event EventHandler StateChanged;
public void Approve()
{
OnStateChanged();
}
}
我如何知道这个事件被引发了?
我尝试了一行事件处理程序实现
bool eventRaised = false;
request.StateChanged += (obj, eventArgs) => eventRaised = true;
request.Approve();
Assert.True(eventRaised);
它有效,但有没有更好的方法?没搞明白,怎么用Assert.Raises()
这是通常建议的方法
然而,以下示例显示了如何使用 Assert.Raises()
来测试您提供的 class 的事件
var request = new Request();
var evt = Assert.Raises<EventArgs>(
h => request.StateChanged += h,
h => request.StateChanged -= h,
() => request.Approve());
Assert.NotNull(evt);
Assert.Equal(request, evt.Sender);
Assert.Equal(EventArgs.Empty, evt.Arguments);
但是,您的事件处理程序需要是通用委托
public event EventHandler<EventArgs> StateChanged;
而不只是 EventHandler
,以便 Assert.Raises
按预期工作。