如何测试不会在 xUnit 中触发事件?

How to test that an event will not be fired in xUnit?

我有两个问题。

  1. 测试事件不会被触发是否有意义?
  2. 如果是,使用 xUnit 框架实现该目标的最佳方法是什么?

例如,我有一个 class 和一个 属性 Mark,

public class Box : INotifyPropertyChanged
{
  private Marking mark = Marking.None;

  public Marking Mark
  {
    get
    {
      return mark;
    }
    set
    {
      mark = value;
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Mark)));
    }
  }

  public event PropertyChangedEventHandler PropertyChanged;
}

我想测试当有人要将Mark的值设置为与当前属性点相同的值时,那么PropertyChanged 事件不会被触发。

1) 是的,这很有道理。如果要求是在某些情况下不应触发事件,则应该对其进行测试。

2) 像这样: ‍‍

[Fact]
public void PropertyChangedNotFired()
{
    Box box = new Box();

    int fireCount = 0;

    box.PropertyChanged += (s, e) => ++fireCount;

    box.Mark = Marking.Tick;

    Assert.Equal(1, fireCount); // Sanity check. Not strictly speaking following AAA

    box.Mark = Marking.Tick;

    Assert.Equal(1, fireCount); // If we get 2, event has wrongly fired
}

这假定一个枚举(你没有显示)类似于:

public enum Marking { None, Tick, Cross }