我是UnitTests和Xunit的新手。我已经编写了一些测试,但是我坚持进行事件测试。
是否可以测试是否未使用xunit调用任何事件?
我使用this example来准备测试。
第一个测试工作正常。对于第二个测试,我期望像“ Assert.RaisesNoEvent”之类的东西。但是,该方法不可用。
还有另一种方法可以测试没有事件被调用吗?
Class
,其中Property2
为Set
时引发事件
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;
}
}
}
TestClass
为Class
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
}
}
答案 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);
}
该技术适用于任何单元测试框架。