I had a small technical C# task using SOLID principle and TDD. But I failed to prove my coding skill through the test.
Can anyone offer any small advice for me? I am really eager to learn what my faults are and how I can improve.
The interview question is here, and my answer is here.
I just reference here some pieces of my source code.
Program.cs
class Program
{
static void Main(string[] args)
{
////////////////////////////////////////////////////////////////////////////////
// Story 1. As a donor
Console.WriteLine("-------------------------------------- Story1\r\n");
//1.1. Craete Tax Calculator
decimal taxRate = 20;
ITaxCalculator taxCalculator = new TaxCalculator(taxRate);
//1.2. Display GiftAid
Console.WriteLine("Please enter donation amount:");
decimal Amount = decimal.Parse(Console.ReadLine());
Console.WriteLine("=> Your Gift Aid is: {0} \r\n\r\n", taxCalculator.GetGiftAid(Amount));
////////////////////////////////////////////////////////////////////////////////
// Story 2. As a site administrator
Console.WriteLine("-------------------------------------- Story2\r\n");
//2.1. Create using factory pattern
taxCalculator = new TaxCalculatorFactory().GetObject(new TaxRepository());
Console.WriteLine("Please enter donation amount:");
Amount = decimal.Parse(Console.ReadLine());
//2.2. Display GiftAid
Console.WriteLine("=> Your Gift Aid is: {0} \r\n\r\n", taxCalculator.GetGiftAid(Amount));
Console.WriteLine("Press any key to exit.");
Console.ReadLine();
}
}
Calculator Classes
interface ITaxCalculatorFactory
{
ITaxCalculator GetObject(decimal taxRate);
ITaxCalculator GetObject(ITaxRepository taxRepo);
}
public class TaxCalculatorFactory
{
public TaxCalculatorFactory()
{
}
public ITaxCalculator GetObject(decimal dAmount)
{
return new TaxCalculator(dAmount);
}
public ITaxCalculator GetObject(ITaxRepository taxRepo)
{
return new TaxCalculatorByData(taxRepo);
}
}
public interface ITaxCalculator
{
decimal GetGiftAid(decimal dAmount);
}
public class TaxCalculator : ITaxCalculator
{
private readonly decimal _taxRate;
public TaxCalculator(decimal taxRate)
{
_taxRate = taxRate;
}
public decimal GetGiftAid(decimal dAmount)
{
var gaRatio = _taxRate / (100 - _taxRate);
return dAmount * gaRatio;
}
}
public class TaxCalculatorByData : ITaxCalculator
{
private readonly ITaxRepository _taxRepo;
public TaxCalculatorByData(ITaxRepository taxRepo)
{
_taxRepo = taxRepo;
}
public decimal GetGiftAid(decimal dAmount)
{
var gaRatio = _taxRepo.GetTaxRate() / (100 - _taxRepo.GetTaxRate());
return dAmount * gaRatio;
}
}
Test Codes
[TestFixture]
public class GetAidTest
{
////////////////////////////////////////////////////////////////////////////////
// Story 1. As a donor
[Test]
public void Story1_Should_Return_TwentyFive_From_GiftAid()
{
/////////////////////////////////////////////////////////////
// Setup
decimal taxRate = 20;
decimal donationAmount = 100;
decimal valueExpected = 25;
var taxCalculator = new TaxCalculator(taxRate);
/////////////////////////////////////////////////////////////
// Action
var result = taxCalculator.GetGiftAid(donationAmount);
/////////////////////////////////////////////////////////////
// Verify the result
Assert.AreEqual(valueExpected, result, "Should return 25");
}
////////////////////////////////////////////////////////////////////////////////
// Story 2. As a administrator
[Test]
public void Story2_Should_Store_TaxRate_Fourty_And_Return_GiftAid()
{
/////////////////////////////////////////////////////////////
// Setup
decimal taxRate = 40;
decimal donationAmount = 100;
decimal valueExpected = 66.67m;
var repository = new Mock<ITaxRepository>();
repository.Setup(r => r.GetTaxRate()).Returns(taxRate);
repository.Setup(r => r.Save(It.IsAny<decimal>())).Verifiable();
ITaxCalculator taxCalculator = new TaxCalculatorFactory().GetObject(repository.Object);
/////////////////////////////////////////////////////////////
// Action
var result = decimal.Round(taxCalculator.GetGiftAid(donationAmount), 2, MidpointRounding.AwayFromZero);
/////////////////////////////////////////////////////////////
// Verify the result
Assert.AreEqual(valueExpected, result, "Should return 25");
}
}