C# 已触发Moq验证事件 A类 { 事件处理程序Event1; } var mock=new mock();

C# 已触发Moq验证事件 A类 { 事件处理程序Event1; } var mock=new mock();,c#,moq,C#,Moq,如何验证触发了Event1?(不使用手动事件处理程序/触发标志)我不确定我是否真的理解你为什么这么问。如果您有一个Mock,那么您可以控制该Mock,那么为什么要验证它是否执行了您可以控制的操作 也就是说,虽然我确实使用了Moq的加薪/加薪,但我仍然经常使用带有lambda的旗帜,我觉得这相当干净: mock.Setup(foo => foo.Submit()).Raises(f => f.Sent += null, EventArgs.Empty); // ... mock.Ver

如何验证触发了Event1?(不使用手动事件处理程序/触发标志)

我不确定我是否真的理解你为什么这么问。如果您有一个
Mock
,那么您可以控制该Mock,那么为什么要验证它是否执行了您可以控制的操作

也就是说,虽然我确实使用了Moq的加薪/加薪,但我仍然经常使用带有lambda的旗帜,我觉得这相当干净:

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

像这样的怎么样

bool eventWasDispatched = false; // yeah, it's the default
var a = new A();
a.Event1 += () => eventWasDispatched = true;
a.DoSomethingToFireEvent();
Assert.IsTrue(eventWasDispatched);
在您的测试中:

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;
}
//此接口包含与事件委托匹配的签名
公共接口IPropertyChangedEventHandler
{
作废PropertyChangedHandler(对象发送方,PropertyChangedEventArgs e);
}
设置名称NotifyPropertyChangedShouldBetriggered()时公共无效
{
//安排
var sut=new Mock();
var handler=newmock();
Setup(o=>o.PropertyChangedHandler(sut,newpropertychangedventargs(nameof(MyClass.Name)));
sut.PropertyChanged+=handlerMock.Object.PropertyChangedHandler;
//表演
sut.Name=“Guy Smiley”;
//断言
handler.Verify();
}

是否有任何使用验证的方法?我目前正在订阅它,并在触发时更改标志。。。但是有点乱,乱吗?按预期的方式测试事件?没关系。出于使用Assert:clear代码和易于键入的原因,我想用一些方法来使用Verify。这是一个很好的答案,但请记住,如果事件遵循标准(sender,EventArgs)模式,则需要相应地调整lambda:
a.Event1+=(sender,args)=>eventWasDispatched=true
bool eventWasDispatched = false; // yeah, it's the default
var a = new A();
a.Event1 += () => eventWasDispatched = true;
a.DoSomethingToFireEvent();
Assert.IsTrue(eventWasDispatched);
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;
}
// 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();
}