hassanhabib / InternalMock

.NET library to mock internal private static methods in the same class that is the subject of test.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

InternalMock

.Net The Standard - COMPLIANT

Introduction

This is a beta release please use carefully.

This library allows you to mock internal private static methods in your service - please watch the following videos for context:

Architecture

Here's the architecture of the library according to The Standard:

image

Examples

Let's Assume you have a service that has several functions that don't call any dependencies. Your service is what we call self-sufficient or dead-end service, as the flow stops there and might just be returned from the same service. An example of a service like this is a tax calculation service, you pass the total income, along with some other details and it calculates the taxes for a certain year. It doesn't call any dependencies.

Now, in that very unique scenario we need to find a way to test-drive that our self-sufficient service here can handle a generic exception or any other exception of any type. Since there are no dependencies injected, it's impossible to tag an exception the regular way where we do:

  this.someDependency.Setup(dependency =>
    dependency.GetStuff())
      .Throws(exception);

The solution here is to create inner dependencies. A self-sufficient service can rely on multiple other private static functions to perform certain functions. We can mock these functions without changing the exception handling code as follows:

Let's say our service looks like this:

public string RetrieveStudentFullName(string firstName, string lastName)
{
  ValidateStudentName(firstName, lastName);

  return $"{firstName} {lastName}";
}

We can write the test as follows to make the ValidateStudentName function throw an exception as follows:

  [Fact]
  public void ShouldThrowServiceExceptionOnRetrieveStudentFullNameIfServiceErrorOccurrs3()
  {
      // given
      var exception = new Exception();

      this.studentService.Mock(
        methodName: "ValidateStudentName")
          .Throws(exception);

      // when
      Action retrieveStudentFullNameAction = () =>
        this.studentService.RetrieveStudentFullName(
          firstName: "Hassan", 
          lastName: "Habib");

      // then
      Assert.Throws<StudentServiceException>(retrieveStudentFullNameAction);

      this.studentService.ClearAllOtherCalls();
  }

And now we can make that very same test pass by doing the following:

  public string RetrieveStudentFullName(string firstName, string lastName)
  {
    try
    {
      ValidateStudentName(firstName, lastName);

      return $"{firstName} {lastName}";
    }
    catch (Exception exception)
    {
      throw new StudentServiceException(exception);
    }
  }

Contact us

For more information contact Hassan Habib: hassanhabib@live.com Also join our Standard Community on Discord Community here:

Discord

About

.NET library to mock internal private static methods in the same class that is the subject of test.

License:MIT License


Languages

Language:C# 100.0%