public class TestSalaryProcessor
public void testSalaryAndTaxInfo()
var DBMock = new Mock<IDB>();
EmployeeSalaryInfo empSalaryInfo = new EmployeeSalaryInfo("Z001","October", 2022 , 8100);
var SalaryInfoMock = new Mock<ISalaryInfo>();
SalaryInfoMock.Setup( x => x.GetSalaryInfo("Z001")).Returns(new SalaryInfo(300, 50, 100));
var WorkingDaysMock = new Mock<ITimeSheetInfo>();
WorkingDaysMock.Setup(x => x.GetCountOfWorkingDaysInAMonth("Z001")).Returns(20);
SalaryProcessor salryProc = new SalaryProcessor(DBMock.Object, SalaryInfoMock.Object, WorkingDaysMock.Object);
salryProc.ProcessSalary("Z001");
DBMock.Verify(x => x.Save(empSalaryInfo), Times.Once());
public interface ISalaryInfo
public SalaryInfo GetSalaryInfo(string employeeID);
public interface ITimeSheetInfo
public int GetCountOfWorkingDaysInAMonth(string employeeID);
private double allowances;
public SalaryInfo(double basic, double hRA, double allowances)
this.Allowances = allowances;
public double Basic {get; set;}
public double HRA {get; set;}
public double Allowances {get; set;}
public class EmployeeSalaryInfo
private string employeeID;
private double netSalary;
public EmployeeSalaryInfo(string employeeID, string month, int year, double netSalary)
this.employeeID = employeeID;
this.netSalary = netSalary;
public EmployeeSalaryInfo()
public string EmployeeID{get;set;}
public string Month{get; set;}
public int Year{get; set;}
public double NetSalary{get;set;}
public override bool Equals(object obj)
EmployeeSalaryInfo empSalaryInfo = obj as EmployeeSalaryInfo;
if (empSalaryInfo != null)
return this.employeeID.Equals(empSalaryInfo.employeeID) &&
this.netSalary.Equals(empSalaryInfo.netSalary);
public class SalaryProcessor
private ISalaryInfo _salaryuObject;
private ITimeSheetInfo _timesheetObject;
public SalaryProcessor(IDB dbObject, ISalaryInfo salaryuObject, ITimeSheetInfo timesheetObject)
_salaryuObject = salaryuObject;
_timesheetObject= timesheetObject;
public void ProcessSalary(string EmployeeID)
SalaryInfo salaryInfo = new SalaryInfo();
salaryInfo = _salaryuObject.GetSalaryInfo(EmployeeID);
double WorkingDays = _timesheetObject.GetCountOfWorkingDaysInAMonth(EmployeeID);
double GrossSalary = (salaryInfo.Basic + salaryInfo.HRA + salaryInfo.Allowances) *WorkingDays ;
double TaxAmount = 0.1 * GrossSalary;
double NetSalary = GrossSalary - TaxAmount;
EmployeeSalaryInfo empSalaryInfo = new EmployeeSalaryInfo("Z001", "Oct", 2020, NetSalary);
_dbObject.Save(empSalaryInfo);
public void Save(EmployeeSalaryInfo empSalaryInfo);
public static void Main()
var x = new NUnitLite.AutoRun().Execute(new string[]{"--test:TestSalaryProcessor", "--noc"});
Console.WriteLine("----------------------------------------------");
Console.WriteLine(x==0?"All Test Passed... :¬)": string.Format("{0} tests failed... :¬(", x));
Console.WriteLine("----------------------------------------------");