如何测试是否没有事件被调用

时间:2018-08-25 16:02:41

标签: c# unit-testing events xunit

我是UnitTests和Xunit的新手。我已经编写了一些测试,但是我坚持进行事件测试。

是否可以测试是否未使用xunit调用任何事件?


我使用this example来准备测试。

第一个测试工作正常。对于第二个测试,我期望像“ Assert.RaisesNoEvent”之类的东西。但是,该方法不可用。

还有另一种方法可以测试没有事件被调用吗?


代码示例

Class,其中Property2Set时引发事件

public class Class 
{
    private int _property2;

    public event EventHandler RelevantPropertyChanged;
    public void OnRelevantPropertyChanged(EventArgs args){
        RelevantPropertyChanged?.Invoke(this, args);
    }

    public int Property1 { get; set; }
    public int Property2 { 
        get { return _property2; }
        set { 
            OnRelevantPropertyChanged(new EventArgs()); 
           _property2 = value; 
        } 
    }
}

TestClassClass

定义了单元测试
public class TestClass 
{

    [Fact]
    public void ChangeProperty2_RaisesEvent() 
    {
        var cl = new Class();
        var args = new EventArgs();

        var evt = Assert.RaisesAny<EventArgs>(
            h => cl.RelevantPropertyChanged += h,
            h => cl.RelevantPropertyChanged -= h,
            () => cl.Property2 = 5);

        Assert.NotNull(evt);
        Assert.Equal(cl, evt.Sender);
        Assert.Equal(args, evt.Arguments);
    }

    [Fact]
    public void ChangeProperty1_RaisesNoEvent()
    {
        var cl = new Class();
        Action code = () => cl.Property1 = 5;

        Assert.RaisesNoEvent(code);          //this is what I want to do
    }
}

1 个答案:

答案 0 :(得分:0)

您可以通过检查是否未调用 EventHandler 来检查是否未引发该事件:

[Fact]
public void ChangeProperty1_RaisesNoEvent()
{
    var instance = new Class();
    bool isInvoked = false;
    instance.RelevantPropertyChanged += (s, e) => isInvoked = true;

    Assert.False(isInvoked);
    instance.Property1 = 5;
    Assert.False(isInvoked);
}

该技术适用于任何单元测试框架。