Raise
The Raise method is used for raising mocked events. You can use custom or standard events.
Raising Custom Events
Assume we have the following interface:
public delegate void CustomEvent(string value);
public interface IFoo
{
event CustomEvent CustomEvent;
}
Public Delegate Sub CustomEvent(value As String)
Public Interface IFoo
Event CustomEvent As CustomEvent
End Interface
Next is an example on how to use Raise to fire custom event.
[TestMethod]
public void ShouldInvokeMethodForACustomEventWhenRaised()
{
string expected = "ping";
string actual = string.Empty;
// Arrange
var foo = Mock.Create<IFoo>();
foo.CustomEvent += delegate(string s)
{
actual = s;
};
// Act
Mock.Raise(() => foo.CustomEvent += null, expected);
// Assert
Assert.AreEqual(expected, actual);
}
<TestMethod>
Public Sub ShouldInvokeMethodForACustomEventWhenRaised()
Dim expected As String = "ping"
Dim actual As String = String.Empty
' Arrange
Dim foo = Mock.Create(Of IFoo)()
AddHandler foo.CustomEvent, Sub(s As String) actual = s
' Act
Mock.Raise(Sub() AddHandler foo.CustomEvent, Nothing, expected)
' Assert
Assert.AreEqual(expected, actual)
End Sub
We use Raise to raise foo.CustomEvent and pass "ping" to it. Before acting we have attached a delegate to the event. Executing the delegate will result in assigning the passed string to actual. Finally, we verify that expected and actual have the same value.
Raising Standard Events
Assume we have the following system under test:
public interface IExecutor<T>
{
event EventHandler<FooArgs> Done;
}
public class FooArgs : EventArgs
{
public FooArgs()
{
}
public FooArgs(string value)
{
this.Value = value;
}
public string Value { get; set; }
}
Public Interface IExecutor(Of T)
Event Done As EventHandler(Of FooArgs)
End Interface
Public Class FooArgs
Inherits EventArgs
Public Sub New()
End Sub
Public Sub New(value As String)
Me.Value = value
End Sub
Public Property Value() As String
Get
Return m_Value
End Get
Set(value As String)
m_Value = value
End Set
End Property
Private m_Value As String
End Class
An example on how to use Raise to fire standard event would look like this:
[TestMethod]
public void ShouldRaiseEventWithStandardEventArgs()
{
string actual = null;
string expected = "ping";
// Arrange
var executor = Mock.Create<IExecutor<int>>();
executor.Done += delegate(object sender, FooArgs args)
{
actual = args.Value;
};
// Act
Mock.Raise(() => executor.Done += null, new FooArgs(expected));
// Assert
Assert.AreEqual(expected, actual);
}
<TestMethod>
Public Sub ShouldRaiseEventWithStandardEventArgs()
Dim actual As String = Nothing
Dim expected As String = "ping"
' Arrange
Dim executor = Mock.Create(Of IExecutor(Of Integer))()
AddHandler executor.Done, Sub(sender As Object, args As FooArgs) actual = args.Value
' Act
Mock.Raise(Sub() AddHandler executor.Done, Nothing, New FooArgs(expected))
' Assert
Assert.AreEqual(expected, actual)
End Sub
Here we use Raise to raise a standard event - executor.Done accepting FooArgs object. The attached delegate sets the Value property in FooArgs object to the variable actual. Finally, we verify that expected and actual have the same value.