C# 如何在xunit中测试引发的事件?

C# 如何在xunit中测试引发的事件?,c#,events,xunit,C#,Events,Xunit,我在课堂上定义了这样的简单事件 class Request { protected virtual void OnStateChanged() { StateChanged?.Invoke(this, EventArgs.Empty); } public event EventHandler StateChanged; public void Approve() { OnStateChanged(); } } 我怎么知道

我在课堂上定义了这样的简单事件

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()
测试提供的类的事件

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);
var请求=新请求();
var evt=Assert.Raises(
h=>request.StateChanged+=h,
h=>request.StateChanged-=h,
()=>request.Approve());
Assert.NotNull(evt);
Assert.Equal(请求,evt.Sender);
等于(EventArgs.Empty,evt.Arguments);
但是,事件处理程序需要是泛型委托

public event EventHandler<EventArgs> StateChanged;
公共事件事件处理程序状态已更改;

而不仅仅是
EventHandler
,以便
Assert.Raises
按预期工作。

谢谢,但是,我得到了一个错误
无法隐式地将type System.EventHandler转换为System.EventHandler
@Muflix Ok解决了这个问题。您的事件是
EventHandler
而不是
EventHandler
是否有更好的方法?是什么促使您获得更好的方法?当前方法缺少什么?我们可以通过使用不同的框架提出多种不同的方法,并启动神圣的测试框架战争;)这完全没问题,但它只有4行,我在想类似于
Assert.Raises(request.StateChanged)
:D最初我还认为我必须创建一个新方法,现在它只有4行(但可以是一行:-)。用一个方法包装它,并将其作为一行使用;)