Controlling Method Behavior Based on the Argument Value

You can control a fake method's behavior based on call arguments by requiring all arguments to match the arguments used in the WhenCalled statement.

Syntax
C#

WhenCalled(() => <method>).WithExactArguments().<behavior>;

VB

WhenCalled(Function() <method>).WithExactArguments().<behavior>

Samples
Sample 1: Faking Method’s Return Value

The following sample shows how to fake the method's return value as follows:

The return value of MethodReturnInt is set to 10 only when the arguments are "typemock" and 1.

The return value of MethodReturnInt is set to 50 only when the arguments are "unit tests" and 2.

C#

[TestMethod, Isolated]
public void FakeReturnValue_BasedOn_ExactMethodArgs()
{
  var fake = Isolate.Fake.Instance<Dependency>();
  Isolate.WhenCalled(() => fake.MethodReturnInt("typemock",1)).WithExactArguments().WillReturn(10);
  Isolate.WhenCalled(() => fake.MethodReturnInt("unit tests", 2)).WithExactArguments().WillReturn(50);

  var result = new ClassUnderTest().SimpleCalculation(fake);
  Assert.AreEqual(60,result);
}
 
public int SimpleCalculation(Dependency dependency)
{
  return dependancy.MethodReturnInt("typemock", 1) + dependancy.MethodReturnInt("unit tests", 2);
}

VB

<TestMethod(), Isolated()> _
Public Sub FakeReturnValue_BasedOn_ExactMethodArgs()
    Dim fake = Isolate.Fake.Instance(Of Dependency)()

    Isolate.WhenCalled(Function() fake.MethodReturnInt("typemock", 1)).WithExactArguments().WillReturn(10)
    Isolate.WhenCalled(Function() fake.MethodReturnInt("unit tests", 2)).WithExactArguments().WillReturn(50)

    Dim result = New ClassUnderTest().SimpleCalculation(fake)
    Assert.AreEqual(60, result)
End Sub

Public Function SimpleCalculation(dependency As Dependency) As Integer
  Return dependency.MethodReturnInt("typemock", 1) + dependency.MethodReturnInt("unit tests", 2)
End Function

Sample 2: Faking a Void Method’s Return Value

The following sample shows how to fake the return value for void methods.

This is the default behavior for indexers, that is each index will return a different value.

C#

[TestMethod, Isolated]
public void FakeVoidMethod_BasedOn_ExactMethodArgs()
{
  var fake = Isolate.Fake.Instance<Dependency>(Members.CallOriginal);
  Isolate.WhenCalled(() => fake.VoidMethod(4)).WithExactArguments().IgnoreCall();
 
  new ClassUnderTest().CallVoid(fake,4);
  // Assert.NoExceptionWasThrown();
}

public void VoidMethod(int n)
{
  throw new NotImplementedException();
}

VB

<TestMethod(), Isolated()> _
Public Sub FakeVoidMethod_BasedOn_ExactMethodArgs()
    Dim fake = Isolate.Fake.Instance(Of Dependency)(Members.CallOriginal)

    Isolate.WhenCalled(Sub() fake.VoidMethod(4)).WithExactArguments().IgnoreCall()

    Dim underTest = New ClassUnderTest()
    underTest.CallVoid(fake, 4)
    ' Assert.NoExceptionWasThrown();
End Sub

Public Sub VoidMethod(n As Integer)
  Throw New NotImplementedException()
End Sub