Gar*_*h D 20 c# vb.net events lambda unit-testing
我相信以下VB.Net代码相当于正在进行的C#代码; 但VB.Net测试失败 - 从未调用处理Lambda的事件.
到底是怎么回事?
VB.Net版本 - 失败:
<TestFixture()> _
Public Class TestClass
<Test()> _
Public Sub EventTest()
Dim eventClass As New EventClass
Dim eventRaised As Boolean = False
AddHandler eventClass.AnEvent, Function() (eventRaised = True)
eventClass.RaiseIt()
Assert.IsTrue(eventRaised)
End Sub
End Class
Public Class EventClass
Public Event AnEvent()
Public Sub RaiseIt()
RaiseEvent AnEvent()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)
C#版本 - 通过:
[TestFixture]
public class TestClass
{
[Test]
public void EventTest()
{
var eventClass = new EventClass();
var eventRaised = false;
eventClass.AnEvent += () => { eventRaised = true; };
eventClass.RaiseIt();
Assert.IsTrue(eventRaised);
}
}
public class EventClass
{
public delegate void EventHandler();
public event EventHandler AnEvent;
public void RaiseIt()
{
AnEvent();
}
}
Run Code Online (Sandbox Code Playgroud)
svi*_*ick 18
对于那些现在发现这个问题的人:自Visual Basic 2010(VB 10.0)以来,匿名Subs确实有用,所以你可以这样写:
Sub() eventRaised = True
Run Code Online (Sandbox Code Playgroud)
Gar*_*h D 16
注意:这与Visual Studio 2010和VB.net 10之前的旧版VB.net有关
区别在于,在VB.Net中,lambda表达式必须返回一个值,即它们必须是函数而不是subs.lambda表达式eventRaised = true被解释为布尔表达式而不是赋值,即评估为false而不是设置为true.
有关MSDN的更多详细信息.
我不认为用于测试示例中的事件的c#模式可以在VB.Net中完成而不引入另一个函数,例如
<TestFixture()> _
Public Class Test
<Test()> _
Public Sub EventTest()
Dim eventClass As New EventClass
Dim eventRaised As Boolean = False
AddHandler eventClass.AnEvent, Function() (SetValueToTrue(eventRaised))
eventClass.RaiseIt()
Assert.IsTrue(eventRaised)
End Sub
Private Function SetValueToTrue(ByRef value As Boolean) As Boolean
value = True
Return True
End Function
End Class
Public Class EventClass
Public Event AnEvent()
Public Sub RaiseIt()
RaiseEvent AnEvent()
End Sub
End Class
Run Code Online (Sandbox Code Playgroud)