📝 Lecture Summary (Quick Revision)

āĻ­āĻŦāĻŋāĻˇā§āϝāϤ⧇ āĻĻā§āϰ⧁āϤ āϰāĻŋāĻ­āĻŋāĻļāύ āĻĻ⧇āĻ“ā§ŸāĻžāϰ āϜāĻ¨ā§āϝ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āϞ⧇āĻ•āϚāĻžāϰ⧇āϰ āĻŽā§‚āϞ āĻ•āĻžāϜāϗ⧁āϞ⧋ āύāĻŋāĻšā§‡ āϞāĻŋāĻ¸ā§āϟ āφāĻ•āĻžāϰ⧇ āĻĻ⧇āĻ“ā§ŸāĻž āĻšāϞ⧋:

  • Interface Update: IPersonsService āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ GetPersonByPersonId āύāĻžāĻŽā§‡āϰ āύāϤ⧁āύ āĻŽā§‡āĻĨāĻĄ āĻĄāĻŋāĻ•ā§āĻ˛ā§‡ā§ŸāĻžāϰ āĻ•āϰāĻž, āϝāĻž āχāύāĻĒ⧁āϟ āĻšāĻŋāϏ⧇āĻŦ⧇ Guid? āĻ—ā§āϰāĻšāĻŖ āĻ•āϰ⧇ āĻāĻŦāĻ‚ PersonResponse? āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰ⧇āĨ¤
  • Dummy Implementation: PersonsService āĻ•ā§āϞāĻžāϏ⧇ āĻŽā§‡āĻĨāĻĄāϟāĻŋāϰ āχāύāĻŋāĻļāĻŋ⧟āĻžāϞ āĻŦāĻž āĻĄāĻžāĻŽāĻŋ āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāύ āĻ•āϰāĻž (āϝ⧇āĻ–āĻžāύ⧇ NotImplementedException āĻĨā§āϰ⧋ āĻ•āϰāĻž āĻšā§Ÿ)āĨ¤
  • Test Case 1 (Null ID): GetPersonByPersonId_NullPersonId āĻŽā§‡āĻĨāĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻšā§‡āĻ• āĻ•āϰāĻž āϝ⧇, āχāύāĻĒ⧁āϟ null āĻĻāĻŋāϞ⧇ āĻŽā§‡āĻĨāĻĄāϟāĻŋ null āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰ⧇ āĻ•āĻŋāύāĻž (Using Assert.Null)āĨ¤
  • Dependency Setup: Test āĻ•ā§āϞāĻžāϏ⧇āϰ āĻ•āύāĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟāϰ⧇ ICountriesService āχāύāĻŋāĻļāĻŋ⧟āĻžāϞāĻžāχāϜ āĻ•āϰāĻž, āĻ•āĻžāϰāĻŖ Person āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āĻ­ā§āϝāĻžāϞāĻŋāĻĄ CountryId āĻĒā§āĻ°ā§Ÿā§‹āϜāύāĨ¤
  • Test Case 2 (Valid ID): GetPersonByPersonId_WithProperPersonId āĻŽā§‡āĻĨāĻĄ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāĨ¤ āĻāĻ–āĻžāύ⧇ āĻĒā§āϰāĻĨāĻŽā§‡ āĻāĻ•āϟāĻŋ Country āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻž āĻšā§Ÿ, āϤāĻžāϰāĻĒāϰ āϏ⧇āχ āĻĻ⧇āĻļ⧇āϰ ID āĻĻāĻŋā§Ÿā§‡ āĻāĻ•āϟāĻŋ Person āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻž āĻšā§ŸāĨ¤ āĻļ⧇āώ⧇ āϏ⧇āχ Person-āĻāϰ ID āĻĻāĻŋā§Ÿā§‡ GetPersonByPersonId āĻ•āϞ āĻ•āϰ⧇ āĻšā§‡āĻ• āĻ•āϰāĻž āĻšā§Ÿ āĻĄā§‡āϟāĻž āĻ āĻŋāĻ•āĻŽāϤ⧋ āφāϏāϛ⧇ āĻ•āĻŋāύāĻž (Using Assert.Equal)āĨ¤
  • TDD Verification: āĻŸā§‡āĻ¸ā§āϟāϗ⧁āϞ⧋ āϰāĻžāύ āĻ•āϰ⧇ āĻĻ⧇āĻ–āĻž āϝ⧇ āϏāĻŦāϗ⧁āϞ⧋ āĻĢ⧇āχāϞ āĻ•āϰāϛ⧇, āĻ•āĻžāϰāĻŖ āĻŽā§‡āĻĨāĻĄāϟāĻŋāϤ⧇ āĻāĻ–āύ⧋ āφāϏāϞ āϞāϜāĻŋāĻ• āϞ⧇āĻ–āĻž āĻšā§ŸāύāĻŋāĨ¤

🧠 Comprehensive Breakdown

āĻāχ āϞ⧇āĻ•āϚāĻžāϰ⧇ āφāĻŽāϰāĻž TDD (Test Driven Development) āĻ…ā§āϝāĻžāĻĒā§āϰ⧋āϚ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ (āĻŦāĻž āϞāĻŋāĻ¸ā§āϟ) āĻĨ⧇āϕ⧇ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ āĻāĻ•āϟāĻŋ ID āĻĻāĻŋā§Ÿā§‡ Person āϖ⧁āρāĻœā§‡ āĻŦ⧇āϰ āĻ•āϰāĻžāϰ āϞāϜāĻŋāĻ• āĻŸā§‡āĻ¸ā§āϟ āĻ•āϰāĻž āĻļāĻŋāĻ–āĻŦāĨ¤ āϚāϞ⧁āύ āĻĒā§āϰāϤāĻŋāϟāĻŋ āϧāĻžāĻĒ āĻŦāĻŋāĻ¸ā§āϤāĻžāϰāĻŋāϤāĻ­āĻžāĻŦ⧇ āĻŦ⧁āĻā§‡ āύāĻŋāχāĨ¤

ā§§. Interface-āĻ Method āĻĄāĻŋāĻ•ā§āϞ⧇āϝāĻŧāĻžāϰ⧇āĻļāύ (Priority: 7/10)

Concept & Why: āϝāĻ–āύ Controller āĻĨ⧇āϕ⧇ āϕ⧋āύ⧋ āĻāĻ•āϟāĻŋ āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ Person-āĻāϰ āĻĄāĻŋāĻŸā§‡āχāϞāϏ āĻĻ⧇āĻ–āĻžāϰ āϰāĻŋāϕ⧋āϝāĻŧ⧇āĻ¸ā§āϟ āφāϏāĻŦ⧇, āϤāĻ–āύ āĻāχ āĻŽā§‡āĻĨāĻĄāϟāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āĻšāĻŦ⧇āĨ¤ āϝāĻĻāĻŋ āĻ“āχ ID-āĻāϰ āϕ⧋āύ⧋ Person āύāĻž āĻĒāĻžāĻ“ā§ŸāĻž āϝāĻžā§Ÿ āĻŦāĻž ID null āĻšā§Ÿ, āϤāĻŦ⧇ Exception āĻĨā§āϰ⧋ āĻ•āϰāĻžāϰ āĻŦāĻĻāϞ⧇ āĻŽā§‡āĻĨāĻĄāϟāĻŋ null āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰāĻŦ⧇āĨ¤ āϤāĻžāχ āϰāĻŋāϟāĻžāĻ°ā§āύ āϟāĻžāχāĻĒ āĻāĻŦāĻ‚ āχāύāĻĒ⧁āϟ āĻĒā§āϝāĻžāϰāĻžāĻŽāĻŋāϟāĻžāϰ āωāϭ⧟āϕ⧇āχ Nullable (?) āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤

// ServiceContracts/IPersonsService.cs
/// <summary>
/// Returns the matching person object
/// </summary>
/// <param name="personId">Person ID to search</param>
/// <returns>Returns matching person object or null</returns>
PersonResponse? GetPersonByPersonId(Guid? personId);
 

⧍. Dummy Implementation in Service (Priority: 5/10)

Concept & Why: āχāĻ¨ā§āϟāĻžāϰāĻĢ⧇āϏ⧇ āĻŽā§‡āĻĨāĻĄ āĻĄāĻŋāĻ•ā§āĻ˛ā§‡ā§ŸāĻžāϰ āĻ•āϰāĻžāϰ āĻĒāϰ Service āĻ•ā§āϞāĻžāϏ⧇ āϤāĻž āχāĻŽāĻĒā§āϞāĻŋāĻŽā§‡āĻ¨ā§āϟ āĻ•āϰāϤ⧇ āĻšā§ŸāĨ¤ TDD-āĻāϰ āύāĻŋ⧟āĻŽ āĻ…āύ⧁āϝāĻžā§Ÿā§€ āϕ⧋āĻĄ āϞ⧇āĻ–āĻžāϰ āφāϗ⧇āχ āϤāĻžāϰ āĻŸā§‡āĻ¸ā§āϟ āϞāĻŋāĻ–āϤ⧇ āĻšā§Ÿ, āϤāĻžāχ āφāĻŽāϰāĻž āϏāĻžāĻŽā§ŸāĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻāĻ•āϟāĻŋ āĻĄāĻžāĻŽāĻŋ āĻāĻ•ā§āϏ⧇āĻĒāĻļāύ āĻĨā§āϰ⧋ āĻ•āϰ⧇ āϰāĻžāĻ–āĻ›āĻŋāĨ¤

(VS / VS Code Shortcut: IPersonsService-āĻāϰ āĻ“āĻĒāϰ āĻ•āĻžāĻ°ā§āϏāϰ āϰ⧇āϖ⧇ Ctrl + . āϚāĻžāĻĒāϞ⧇ “Implement Interface” āĻ…āĻĒāĻļāύ āφāϏāĻŦ⧇, āϝāĻž āĻ¸ā§āĻŦ⧟āĻ‚āĻ•ā§āϰāĻŋ⧟āĻ­āĻžāĻŦ⧇ āĻŽā§‡āĻĨāĻĄ āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĨ¤)

// Services/PersonsService.cs
public PersonResponse? GetPersonByPersonId(Guid? personId)
{
    throw new NotImplementedException();
}
 

ā§Š. Unit Test 1: Null PersonId āĻšā§‡āĻ• āĻ•āϰāĻž (Priority: 9/10)

Concept & Why: āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻĨāĻŽ āĻŸā§‡āĻ¸ā§āϟ āϕ⧇āϏ āĻšāĻ˛ā§‹â€” āϝāĻĻāĻŋ āχāωāϜāĻžāϰ āϭ⧁āϞ āĻ•āϰ⧇ null āĻ­ā§āϝāĻžāϞ⧁ āĻĒāĻžāĻ āĻžā§Ÿ, āϤāĻŦ⧇ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻ•ā§āĻ°ā§āϝāĻžāĻļ āύāĻž āĻ•āϰ⧇ āϝ⧇āύ āϏ⧁āĻ¨ā§āĻĻāϰāĻ­āĻžāĻŦ⧇ null āϰāĻŋāϟāĻžāĻ°ā§āύ āĻ•āϰ⧇āĨ¤

#region GetPersonByPersonId
[Fact]
public void GetPersonByPersonId_NullPersonId()
{
    // Arrange
    Guid? personId = null;
 
    // Act
    PersonResponse? person_response_from_get = _personsService.GetPersonByPersonId(personId);
 
    // Assert
    Assert.Null(person_response_from_get);
}
#endregion
 

ā§Ē. Test Class-āĻ Dependency Setup (Priority: 8/10)

Concept & Why: āĻāĻ•āϟāĻŋ āĻ­ā§āϝāĻžāϞāĻŋāĻĄ Person āϤ⧈āϰāĻŋ āĻ•āϰāϤ⧇ āĻšāϞ⧇ āϤāĻžāϰ CountryId (Foreign Key) āĻĻāϰāĻ•āĻžāϰāĨ¤ āϝ⧇āĻšā§‡āϤ⧁ āĻĒā§āϰāϤāĻŋāϟāĻŋ āχāωāύāĻŋāϟ āĻŸā§‡āĻ¸ā§āϟ āϏāĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¸ā§āĻŦāĻžāϧ⧀āύ (Independent) āĻāĻŦāĻ‚ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ/āϞāĻŋāĻ¸ā§āϟ āĻĢāĻžāρāĻ•āĻž āĻĨāĻžāϕ⧇, āϤāĻžāχ āφāĻŽāĻžāĻĻ⧇āϰ āĻŸā§‡āĻ¸ā§āĻŸā§‡āϰ āϭ⧇āϤāϰ⧇āχ āφāϗ⧇ āĻāĻ•āϟāĻŋ Country āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϰ āϜāĻ¨ā§āϝ PersonsServiceTest āĻ•ā§āϞāĻžāϏ⧇āϰ āĻ•āύāĻ¸ā§āĻŸā§āϰāĻžāĻ•ā§āϟāϰ⧇ CountriesService āχāύāĻœā§‡āĻ•ā§āϟ āĻ•āϰāϤ⧇ āĻšāĻŦ⧇āĨ¤

public class PersonsServiceTest
{
    private readonly IPersonsService _personsService;
    private readonly ICountriesService _countriesService;
 
    public PersonsServiceTest()
    {
        _personsService = new PersonsService();
        _countriesService = new CountriesService();
    }
}
 

ā§Ģ. Unit Test 2: Valid PersonId āĻĻāĻŋāϝāĻŧ⧇ āĻĄā§‡āϟāĻž āϰāĻŋāĻŸā§āϰāĻŋāĻ­ āĻ•āϰāĻž (Priority: 10/10)

Concept & Why: āĻāϟāĻŋ āĻāχ āϞ⧇āĻ•āϚāĻžāϰ⧇āϰ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āϗ⧁āϰ⧁āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻ…āĻ‚āĻļāĨ¤ xUnit-āĻ Test Isolation-āĻāϰ āĻ•āĻžāϰāϪ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻĒā§āϰāĻĨāĻŽā§‡ āĻāĻ•āϟāĻŋ Country āĻ…ā§āϝāĻžāĻĄ āĻ•āϰ⧇ āϤāĻžāϰ ID āύāĻŋāϤ⧇ āĻšāĻŦ⧇, āϤāĻžāϰāĻĒāϰ āϏ⧇āχ ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻāĻ•āϟāĻŋ Person āĻ…ā§āϝāĻžāĻĄ (Arrange) āĻ•āϰ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤ āĻāϰāĻĒāϰ āĻœā§‡āύāĻžāϰ⧇āϟ āĻšāĻ“ā§ŸāĻž Person ID āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĄā§‡āϟāĻž āϤ⧁āϞ⧇ āφāύāϤ⧇ (Act) āĻšāĻŦ⧇āĨ¤ āĻāĻŦāĻ‚ āϏāĻŦāĻļ⧇āώ⧇ Expected āĻāĻŦāĻ‚ Actual āĻĄā§‡āϟāĻž āĻŽā§‡āϞāĻžāϤ⧇ (Assert) āĻšāĻŦ⧇āĨ¤

[Fact]
public void GetPersonByPersonId_WithProperPersonId()
{
    // Arrange 1: Country āϤ⧈āϰāĻŋ āĻ•āϰāĻž
    CountryAddRequest country_request = new CountryAddRequest() { CountryName = "Canada" };
    CountryResponse country_response = _countriesService.AddCountry(country_request);
 
    // Arrange 2: Person āϤ⧈āϰāĻŋ āĻ•āϰāĻž (āĻ“āĻĒāϰ⧇āϰ CountryId āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇)
    PersonAddRequest person_request = new PersonAddRequest()
    {
        PersonName = "John",
        Email = "john@example.com",
        Address = "123 Street",
        CountryId = country_response.CountryId,
        Gender = GenderOptions.Male,
        DateOfBirth = DateTime.Parse("2000-01-01"),
        ReceiveNewsLetters = false
    };
 
    PersonResponse person_response_from_add = _personsService.AddPerson(person_request);
 
    // Act: āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻž Person āĻāϰ ID āĻĻāĻŋā§Ÿā§‡ āĻĄā§‡āϟāĻž āϰāĻŋāĻŸā§āϰāĻŋāĻ­ āĻ•āϰāĻž
    PersonResponse? person_response_from_get = _personsService.GetPersonByPersonId(person_response_from_add.PersonId);
 
    // Assert: āĻ…ā§āϝāĻžāĻĄ āĻ•āϰāĻž āĻĄā§‡āϟāĻž (Expected) āĻāĻŦāĻ‚ āϰāĻŋāĻŸā§āϰāĻŋāĻ­ āĻ•āϰāĻž āĻĄā§‡āϟāĻž (Actual) āĻšā§āĻŦāĻšā§ āĻāĻ• āĻ•āĻŋāύāĻž āϤāĻž āĻšā§‡āĻ• āĻ•āϰāĻž
    Assert.Equal(person_response_from_add, person_response_from_get);
}
 

āύ⧋āϟ: Assert.Equal āĻāĻ–āĻžāύ⧇ āϏāĻ āĻŋāĻ•āĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰāĻŦ⧇ āĻ•āĻžāϰāĻŖ āφāϗ⧇āϰ āϞ⧇āĻ•āϚāĻžāϰāϗ⧁āϞ⧋āϤ⧇ āφāĻŽāϰāĻž PersonResponse āĻ•ā§āϞāĻžāϏ⧇ Equals āĻŽā§‡āĻĨāĻĄāϟāĻŋ Override āĻ•āϰ⧇ āĻāϏ⧇āĻ›āĻŋāϞāĻžāĻŽ, āϝāĻž Value Equality āĻšā§‡āĻ• āĻ•āϰ⧇āĨ¤


🚀 Modern C# (.NET 10) Updates & Smarter Approach

āϞ⧇āĻ•āϚāĻžāϰ⧇āϰ āϕ⧋āĻĄāϟāĻŋ āϏāĻ āĻŋāĻ•, āϤāĻŦ⧇ āφāϧ⧁āύāĻŋāĻ• C# (C# 9 - 12) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻŸā§‡āĻ¸ā§āϟāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋ āφāϰāĻ“ āĻ¸ā§āĻŽāĻžāĻ°ā§āϟ āĻ“ āĻ•ā§āϞāĻŋāύ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

1. Target-typed new Expressions: āĻ…āĻŦāĻœā§‡āĻ•ā§āϟ āϤ⧈āϰāĻŋ āĻ•āϰāĻžāϰ āϏāĻŽā§Ÿ āĻ•ā§āϞāĻžāϏ⧇āϰ āύāĻžāĻŽ āĻŦāĻžāϰāĻŦāĻžāϰ āύāĻž āϞāĻŋāϖ⧇ āĻļ⧁āϧ⧁ new() āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻž āϝāĻžā§ŸāĨ¤

// Old
CountryAddRequest country_request = new CountryAddRequest() { CountryName = "Canada" };
 
// Modern (C# 9+)
CountryAddRequest country_request = new() { CountryName = "Canada" };
 

2. Assert.Equivalent (xUnit Update): āφāϗ⧇āϰ āϞ⧇āĻ•āϚāĻžāϰāϗ⧁āϞ⧋āϤ⧇ āφāĻŽāĻžāĻĻ⧇āϰ āĻŽā§āϝāĻžāύ⧁⧟āĻžāϞāĻŋ Equals āĻŽā§‡āĻĨāĻĄ āĻ“āĻ­āĻžāϰāϰāĻžāχāĻĄ āĻ•āϰāϤ⧇ āĻšā§Ÿā§‡āĻ›āĻŋāϞāĨ¤ āĻ•āĻŋāĻ¨ā§āϤ⧁ xUnit-āĻāϰ āφāϧ⧁āύāĻŋāĻ• āĻ­āĻžāĻ°ā§āϏāύāϗ⧁āϞ⧋āϤ⧇ Assert.Equivalent() āĻŽā§‡āĻĨāĻĄ āφāύāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤ āφāĻĒāύāĻŋ āϝāĻĻāĻŋ Equals āĻŽā§‡āĻĨāĻĄ āĻ“āĻ­āĻžāϰāϰāĻžāχāĻĄ āύāĻžāĻ“ āĻ•āϰ⧇āύ, āϤāĻŦ⧁āĻ“ Assert.Equivalent() āĻĻ⧁āϟāĻŋ āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸā§‡āϰ āϭ⧇āϤāϰ⧇āϰ āĻĒā§āϰāĻĒāĻžāĻ°ā§āϟāĻŋāϗ⧁āϞ⧋āϰ āĻ­ā§āϝāĻžāϞ⧁ (Value Equality) āĻšā§‡āĻ• āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇!

// Modern way to check object equivalence without needing custom Equals() override
Assert.Equivalent(person_response_from_add, person_response_from_get);
 

🏆 Best Practices (For xUnit & Service Testing)

  • Test Independence: āĻāĻ•āϟāĻŋ āχāωāύāĻŋāϟ āĻŸā§‡āĻ¸ā§āϟāϕ⧇ āĻ•āĻ–āύ⧋āχ āĻ…āĻ¨ā§āϝ āĻāĻ•āϟāĻŋ āχāωāύāĻŋāϟ āĻŸā§‡āĻ¸ā§āĻŸā§‡āϰ āĻ“āĻĒāϰ āύāĻŋāĻ°ā§āĻ­āϰāĻļā§€āϞ āĻ•āϰāĻž āϝāĻžāĻŦ⧇ āύāĻžāĨ¤ āĻŸā§‡āĻ¸ā§āϟ āϰāĻžāύ āĻšāĻ“ā§ŸāĻžāϰ āφāϗ⧇ āĻĄāĻžāϟāĻžāĻŦ⧇āϏ/āĻĄāĻžāϟāĻž āĻ¸ā§āĻŸā§‹āϰ āĻĄāĻŋāĻĢāĻ˛ā§āϟ āĻ…āĻŦāĻ¸ā§āĻĨāĻžā§Ÿ (Empty) āφāϛ⧇ āϧāϰ⧇ āύāĻŋā§Ÿā§‡ āŽ¤ā¯‡āŽĩā¯ˆāŽ¯āŽžāŽŠ āĻĄā§‡āϟāĻž āĻŸā§‡āĻ¸ā§āĻŸā§‡āϰ āϭ⧇āϤāϰ⧇āχ (Arrange āĻŦā§āϞāϕ⧇) āϤ⧈āϰāĻŋ āĻ•āϰ⧇ āύāĻŋāϤ⧇ āĻšāĻŦ⧇ (āϝ⧇āĻŽāύāϟāĻŋ āϞ⧇āĻ•āϚāĻžāϰ⧇ Country āĻ…ā§āϝāĻžāĻĄ āĻ•āϰ⧇ āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇)āĨ¤
  • AAA Pattern: āĻŸā§‡āĻ¸ā§āĻŸā§‡āϰ āϭ⧇āϤāϰ⧇ āĻ•āĻŽā§‡āĻ¨ā§āϟ āĻ•āϰ⧇ // Arrange, // Act, // Assert āĻŦā§āϞāĻ•āϗ⧁āϞ⧋ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āϰāĻžāĻ–āĻž āωāϚāĻŋāϤāĨ¤ āĻāϤ⧇ āĻ…āĻ¨ā§āϝ āĻĄā§‡āϭ⧇āϞāĻĒāĻžāϰāϰāĻž āϕ⧋āĻĄ āĻĻ⧇āĻ–āϞ⧇āχ āĻŦ⧁āĻāϤ⧇ āĻĒāĻžāϰ⧇ āĻŸā§‡āĻ¸ā§āĻŸā§‡āϰ āĻĢā§āϞ⧋ āϕ⧇āĻŽāύāĨ¤
  • Meaningful Naming: āĻŸā§‡āĻ¸ā§āϟ āĻŽā§‡āĻĨāĻĄā§‡āϰ āύāĻžāĻŽ āĻĻ⧇āϖ⧇āχ āĻāϰ āωāĻĻā§āĻĻ⧇āĻļā§āϝ āĻŦā§‹āĻāĻž āωāϚāĻŋāϤāĨ¤ āϝ⧇āĻŽāύ: GetPersonByPersonId_WithProperPersonId_ReturnsPersonResponseāĨ¤