Thursday, 24 October 2024

Unit Test Coding

What is Assert method?

Assert is a static class which contains some methods to help you make checks in your test code. The methods check your condition and if the condition fails, it’ll also make the test fail with a nice message to it. These methods are pretty straightforward so I will just mention a couple of them, without explaining them.

  1. Assert.AreEqual(object, object)
  2. Assert.IsTrue(bool), Assert.IsFalse(bool)
  3. Assert.IsNull(object), Assert.IsNotNull(object)
  4. Assert.ThrowsException(Action) — useful if you expect an excetion to be thrown

1: Unit Testing a Static Method of a Static Class using MOQ

Below function will take identity as a parameter and check if user is Manager.

  public static class ApplicationUtils
    {
        public static bool IsUserAManager(IIdentity identity)
        {
            if (identity == null)
                throw new NullReferenceException("identity");


            return identity.Name == "AdminUser";
        }
    }

And Your Test Class using Moq.

  using DemoClassLib;
  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using System.Security.Principal;
 
  namespace DemoUnitTestProject
  {
      [TestClass]
      public class UnitTest1
      {
          [TestMethod]
          public void IsUserAManagerTestIsAdminReturnsFalse()
          {
// Arrange
              var mockedIdentity = new Moq.Mock<IIdentity>();
              mockedIdentity.Setup(x => x.Name).Returns("notanadmin");
 
// Act
              var result = ApplicationUtils.IsUserAManager(mockedIdentity.Object);
 
// Assert
              Assert.IsFalse(result);
          }
 
          [TestMethod]
          public void IsUserAManagerTestIsAdminReturnsTrue()
          {
// Arrange
              var mockedIdentity = new Moq.Mock<IIdentity>();
              mockedIdentity.Setup(x => x.Name).Returns("AdminUser");
 
// Act
              var result = ApplicationUtils.IsUserAManager(mockedIdentity.Object);
 
// Assert
              Assert.IsTrue(result);
          }
      }
  }

Explanation

Test Class and Methods: Each test method is annotated with the [TestMethod] attribute. The class is marked with [TestClass].
Arrange-Act-Assert Pattern:
        Arrange: Set up the necessary variables.
        Act: Call the method under test.
        Assert: Verify the result using assertions.
Multiple Test Cases: You can create multiple test methods to cover various scenarios and edge cases.


2:  Amazing Ways to Unit Test Code That Calls Static Method in C#

Static methods can often seem like an excellent way to achieve reusability.

Write them once and call them whenever you want. The problem, however, arises when you need to test the C# code that calls a static method. It’s not straightforward to mock the static method for testing purposes.

There are three ways to test the code that calls static methods:

  1. Create a wrapper class and use dependency injection
  2. Use a static Func property
  3. Use the Extract and override call
Follow link here for more...

3: Create a Unit test for below service function which is calling repository method.

  public interface IRepository
  {
      string GetData(int id);
  }

  public class MyService
  {
      private readonly IRepository _repository;

      public MyService(IRepository repository)
      {
          _repository = repository;
      }

      public string GetServiceData(int id)
      {
          return _repository.GetData(id);
      }
  }

Now, create a test method in test class:

  [TestMethod]
  public void GetServiceData_ReturnsExpectedData()
  {
      // Arrange
      var mockRepo = new Mock<IRepository>();
      mockRepo.Setup(repo => repo.GetData(1)).Returns("Test Data");

      var service = new MyService(mockRepo.Object);

      // Act
      var result = service.GetServiceData(1);

      // Assert
      Assert.AreEqual("Test Data", result);
  }

Definitions for the following examples:

  public interface IEmployee
  {
      EmploymentHistory EmploymentHistory { get; set; }
      string Name { get; set; }
      int Id { get; set; }
      bool IsEmployeeExist(string value);
      bool DoSomething(int number, string value);
      Task<bool> DoSomethingAsync();
      string DoSomethingStringy(string value);
      bool IsEmployeeExist(string value, out string outputValue);
      bool Submit(ref EmploymentHistory bar);
      int GetEmployeeCount();
      bool Add(int value);
  }

  public class EmploymentHistory
  {
      public virtual Employer Employer { get; set; }
      public virtual bool Submit() { return false; }
  }

  public class Employer
  {
      public virtual string Name { get; set; }
  }

You can setup the behavior of any of a mock's overridable methods using Setup, combined with e.g. Returns (so they return a value) or Throws (so they throw an exception):

  var mock = new Mock<IEmployee>();
  mock.Setup(emp => emp.IsEmployeeExist("suraj")).Returns(false);

  // out arguments
  var outString = "welcome";
  // IsEmployeeExist will return true, and the out argument will return "welcome",
// lazy evaluated
  mock.Setup(emp => emp.IsEmployeeExist("suraj", out outString)).Returns(true);

  // access invocation arguments when returning a value
  mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
  // Multiple parameters overloads available

  // throwing when invoked with specific parameters
  mock.Setup(emp => emp.IsEmployeeExist("12ka4")).Throws<InvalidOperationException>();
  mock.Setup(emp => emp.IsEmployeeExist("")).Throws(new ArgumentException("command"));

  // lazy evaluating return value
  var count = 1;
  mock.Setup(emp => emp.GetEmployeeCount()).Returns(() => count);

  // async methods (see below for more about async):
  mock.Setup(emp => emp.DoSomethingAsync().Result).Returns(true);

  // ref arguments
  var instance = new EmploymentHistory();
  // Only matches if the ref argument to the invocation is the same instance
  mock.Setup(emp => emp.Submit(ref instance)).Returns(true);

It.IsAny<T> is checking that the parameter is of type T, it can be any instance of type T. It's basically saying, I don't care what you pass in here as long as it is type of T.

4: Write a Unit test for following EntityClass.

  public interface IEntityRepository
  {
      string GetName(int id);
  }
 
  public class EntityRepository:IEntityRepository
  {
      public string GetName(int id)
      {
          // Code to connect to DB and get name based on Id
          return "NameFromDb";
      }
  }
  public class EntityClass
  {
      private IEntityRepository _entityRepository;
      public EntityClass(IEntityRepository entityRepository)
      {
          this._entityRepository = entityRepository;
      }
      public string Name { get; set; }
      public string GetNameWithPrefix(int id)
      {
          string name = string.Empty;
          if (id > 0)
          {
              name = this._entityRepository.GetName(id);
          }
          return "Mr. " + name;
      }
  }

Unit test methods here.

Example of mock vs stub using Moq. I have used Verify but you can use VerifyAll as well.

  using Microsoft.VisualStudio.TestTools.UnitTesting;
  using Moq;
  ...
 
  [TestClass]
  public class UnitTest1
  {
      /// <summary>
      /// Test using Mock to Verify that GetNameWithPrefix method calls
      /// Repository GetName method once when Id is greater than Zero
      /// </summary>
      [TestMethod]
      public void GetNameWithPrefix_IdIsTwelve_GetNameCalledOnce()
      {
          // Arrange
          var mockEntityRepository = new Mock<IEntityRepository>();
          mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
 
          var entity = new EntityClass(mockEntityRepository.Object);
          // Act
          var name = entity.GetNameWithPrefix(12);
          // Assert
          mockEntityRepository.Verify(
              m => m.GetName(It.IsAny<int>()), Times.Once);
      }
 
      /// <summary>
      /// Test using Mock to Verify that GetNameWithPrefix method
      /// doesn't calls Repository GetName method when Id is Zero
      /// </summary>
      [TestMethod]
      public void GetNameWithPrefix_IdIsZero_GetNameNeverCalled()
      {
          // Arrange
          var mockEntityRepository = new Mock<IEntityRepository>();
          mockEntityRepository.Setup(m => m.GetName(It.IsAny<int>()));
          var entity = new EntityClass(mockEntityRepository.Object);
          // Act
          var name = entity.GetNameWithPrefix(0);
          // Assert
          mockEntityRepository.Verify(
              m => m.GetName(It.IsAny<int>()), Times.Never);
      }
 
      /// <summary>
      /// Test using Stub to Verify that GetNameWithPrefix method
      /// returns Name with a Prefix
      /// </summary>
      [TestMethod]
      public void GetNameWithPrefix_IdIsTwelve_ReturnsNameWithPrefix()
      {
          // Arrange
          var stubEntityRepository = new Mock<IEntityRepository>();
          stubEntityRepository.Setup(m => m.GetName(It.IsAny<int>()))
              .Returns("Stub");
          const string EXPECTED_NAME_WITH_PREFIX = "Mr. Stub";
          var entity = new EntityClass(stubEntityRepository.Object);
          // Act
          var name = entity.GetNameWithPrefix(12);
          // Assert
          Assert.AreEqual(EXPECTED_NAME_WITH_PREFIX, name);
      }
  }



Continue Reading →

Wednesday, 9 October 2024

Unsubscribe observable

How to Unsubscribe

Various ways to Unsubscribe

Use Async Pipe: Use Async pipe to subscribe to an observable, it automatically cleans up, when we destroy the component.

Use Unsubscribe(): Use Unsubscribe() method on the subscription. It will clean up all listeners and frees up the memory

To do that, first create a variable to store the subscription.

  obs: Subscription;

Assign the subscription to the obs variable

  this.obs = this.src.subscribe(value => {
    console.log("Received " + this.id);
  });

Call the unsubscribe() method in the ngOnDestroy method.

  ngOnDestroy() {
    this.obs.unsubscribe();
  }

When we destroy the component, the observable is unsubscribed and cleaned up.

Continue Reading →

Sunday, 6 October 2024

Clean Architecture

What is Clean Architecture?

Clean Architecture is a design pattern that separates an application into different layers based on their responsibility.  It’s a way of organizing your code into independent, testable, and reusable components. 

It isolates the business logic of the application from external details such as user interfaces, databases, and frameworks.

The primary objective of Clean Architecture is to create a structure that makes it easy to manage and maintain an application as it grows and changes over time. It also makes it easy to add new features, fix bugs, and make changes to existing functionality without affecting the rest of the application.

Implementing Clean Architecture in ASP .NET Core Web API

To apply Clean Architecture, we can divide the application into four primary layers:

Domain Layer – The domain layer represents the application’s core business rules and entities. This is the innermost layer and should not have any external dependencies. It contains domain entities, value objects, and domain services.

Application Layer – The application layer sits just outside the domain layer and acts as an intermediary between the domain layer and other layers. In other words, it contains the use cases of the application and we expose the core business rules of the domain layer through the application layer. This layer depends just on the domain layer.

Infrastructure Layer – We implement all the external services like databases, file storage, emails, etc. in the infrastructure layer. It contains the implementations of the interfaces defined in the domain layer.

Presentation Layer – The presentation layer handles the user interactions and fetches data to the user interface. It contains the user interface components (e.g., MVC, API Controllers, Blazor components).

With Clean Architecture, the Domain and Application layers are at the center of the design. This is known as the Core of the system.

The Domain layer contains enterprise logic and types and the Application layer contains business logic and types. The difference is that enterprise logic could be shared across many systems, whereas the business logic will typically only be used within this system.

Implementing the Project Structure:

Creating the Core Layer:

  1. Define Entities and Use Cases.
  2. Create a folder named “Core.”
  3. Within this folder, classes for Entities such as “User.cs” or “Product.cs” are created.
  4. Create interfaces or abstract classes for Use Cases like “IUserService.cs”.

Creating the Application Layer:

  1. Implement Use Cases.
  2. Create a folder named “Application.”
  3. Implement Use Cases as classes that inherit from the interfaces defined in the Core layer.
  4. For example: “UserService.cs”.

Creating the Infrastructure Layer:

  1. Implement Interface Adapters.
  2. Create a folder named “Infrastructure.”
  3. Implement concrete classes for the interfaces defined in the Core layer.
  4. For example: “UserRepository.cs” for “IUserRepository”.

Project Structure


Benefits of Clean Architecture:

Maintainability: Easier to modify and extend the system.

Flexibility: Adapts to changing requirements with minimal impact on other components.

Scalability: Better suited for large, complex systems.

Reference

https://code-maze.com/ , 

https://positiwise.com/

https://www.macrix.eu/ ,

https://medium.com/


Continue Reading →

Saturday, 5 October 2024

RESTful API

 RESTful API, or Representational State Transfer API, is a set of rules and conventions for building and interacting with web services.

Key Principles of RESTful APIs:

Statelessness: Each request from a client must contain all the information the server needs to fulfill that request. The server does not store any client context between requests.

HTTP Methods: RESTful APIs use standard HTTP methods to perform operations on resources: GET, PUT, POST, DELETE

Stateless Operations: Each operation on the resource should be independent of others, ensuring scalability and reliability.

Client-Server Separation: The client and server operate independently

Benefits:

Scalability: Stateless interactions can scale more easily.

Flexibility: Clients and servers can evolve independently.

Caching: HTTP protocols allow responses to be cached for performance.

Overall, RESTful APIs are widely used for their simplicity and effectiveness in enabling communication between web services and applications.

RESTful APIs can be secured using HTTPS encryption, authentication mechanisms, and authorization mechanisms.

Continue Reading →

Topics

ADFS (1) ADO .Net (1) Ajax (1) Angular (47) Angular Js (15) ASP .Net (14) Authentication (4) Azure (3) Breeze.js (1) C# (49) CD (1) CI (2) CloudComputing (2) Coding (8) CQRS (1) CSS (2) Design_Pattern (7) DevOps (4) DI (3) Dotnet (10) DotnetCore (19) Entity Framework (4) ExpressJS (4) Html (4) IIS (1) Javascript (17) Jquery (8) Lamda (3) Linq (10) microservice (4) Mongodb (1) MVC (46) NodeJS (8) React (10) SDLC (1) Sql Server (32) SSIS (3) SSO (1) TypeScript (3) UI (1) UnitTest (2) WCF (14) Web Api (16) Web Service (1) XMl (1)

Dotnet Guru Archives