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