首页 > 解决方案 > 如何测试在 xUnit 中不会触发事件?

问题描述

我有两个问题。

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

例如,我有一个具有单个属性的类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不会触发该事件。

标签: c#unit-testingeventsxunit

解决方案


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

2)像这样的东西:‍‍</p>

[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 }

推荐阅读