Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods Handling Base Methods

Handling Base Methods

Changing Behavior

Handling ‘hidden’ base methods is tricky when testing components.
A ‘hidden’ base is a virtual method that has an overridden implementation.
The OnBase() API is there to help in these situations.

For example:

C#

public class BaseClass
{
  public virtual int VirtualMethod(bool call)
  {
    // do something with the network
    ...
    return theValue;	
  }
}

public class DerivedClass : BaseClass
{
  public override int VirtualMethod(bool call)
  {
     return base.VirtualMethod(call) + 1;
  }
}

VB

Public Class BaseClass
    Public Overridable Function VirtualMethod([call] As Boolean) As Integer
        ' do something with the network
        ...
        Return theValue
    End Function
End Class

Public Class DerivedClass
    Inherits BaseClass
    Public Overrides Function VirtualMethod([call] As Boolean) As Integer
        Return MyBase.VirtualMethod([call]) + 1
    End Function
End Class

Now use OnBase to tell Isolator to fake only the base of the method.

C#

[TestMethod, Isolated]
public void FakeBase_OnlyBaseIsFaked()
{
  var unfake = new DerivedClass();
  Isolate.WhenCalled(()=>unfake.VirtualMethod(false)).OnBase().WillReturn(10);

  Assert.AreEqual(11, unfake.VirtualMethod(true));
}

VB

<TestMethod, Isolated>
Public Sub FakeBase_OnlyBaseIsFaked()
    Dim unfake = New DerivedClass()
    Isolate.WhenCalled(Function() unfake.VirtualMethod(False)).OnBase().WillReturn(10)

    Assert.AreEqual(11, unfake.VirtualMethod(True))
End Sub

Isolator also supports faking a base of a base, to do this simply pass the type of the base you want to fake. E.g.

C#

Isolate.WhenCalled(()=>unfake.VirtualMethod(false)).OnBase(typeof(BaseClass)).WillReturn(10);

VB

Isolate.WhenCalled(Function() unfake.VirtualMethod(False)).OnBase(GetType(BaseClass)).WillReturn(10)

In Insights you can see that the derived is not faked and the base is:


Verifying Called

To verify that a base method was called, we have added a new API OnBase().

For example:

C#

public class BaseClass
{
  public virtual int VirtualMethod(bool call)
  {
     return 1;
  }
}

public class DerivedClass : BaseClass
{
  public override int VirtualMethod(bool call)
  {
    if (call)
       return base.VirtualMethod(call) + 1;

    return 1;
  }
}

VB

Public Class BaseClass
    Public Overridable Function VirtualMethod([call] As Boolean) As Integer
        Return 1
    End Function
End Class

Public Class DerivedClass
    Inherits BaseClass
    Public Overrides Function VirtualMethod([call] As Boolean) As Integer
        If [call] Then
            Return MyBase.VirtualMethod([call]) + 1
        End If

        Return 1
    End Function
End Class

Now use OnBase to tell Isolator to verify only the base of the method.

C#

[TestMethod, Isolated]
public void VerifyBase_BaseWasNotCalled()
{
    // Same as new DerivedClass, but Isolator tracks calls
    var unfake = Isolate.Fake.Instance<DerivedClass>(Members.CallOriginal);                       
    unfake.VirtualMethod(false);
 
    // Verify that base was not called
    Isolate.Verify.OnBase().WasNotCalled(() => unfake.VirtualMethod(true));
}

VB

 <TestMethod, Isolated>
Public Sub VerifyBase_BaseWasNotCalled()
    ' Same as new DerivedClass, but Isolator tracks calls
    Dim unfake = Isolate.Fake.Instance(Of DerivedClass)(Members.CallOriginal)
    unfake.VirtualMethod(False)

    ' Verify that base was not called
    Isolate.Verify.OnBase().WasNotCalled(Function() unfake.VirtualMethod(True))
End Sub

Isolator also supports faking a base of a base, to do this simply pass the type of the base you want to fake. E.g.

C#

Isolate.WhenCalled(()=>unfake.VirtualMethod(false)).OnBase(typeof(BaseClass)).WillReturn(10);

VB

Isolate.WhenCalled(Function() unfake.VirtualMethod(False)).OnBase(GetType(BaseClass)).WillReturn(10)

OnBase is supported for NonPublic method too.