mercredi 20 juillet 2016

How to write unit tests for proxy pattern?

Will be thankful for your attention, time and efforts !
I have the following code

public class Employee
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Role { get; set; }
}

public interface IEmployeeRepository
{
    Employee GetEmployee(string firstName, string role);
}

public class EmployeeRepository : IEmployeeRepository
{
    public Employee GetEmployee(string firstName, string role)
    {
        //logic here
        return new Employee();
    }
}

Now i want to implement cache for EmployeeRepository. At first i did it using Proxy design pattern

 public class ProxyEmployeeRepository : IEmployeeRepository
{
    private EmployeeRepository _employeeRepository = new EmployeeRepository();
    private MemoryCache _cache = new MemoryCache("UsualCache");
    public Employee GetEmployee(string firstName, string role)
    {
        //do not cache administrators
        if (role == "admin")
        {
            return _employeeRepository.GetEmployee(firstName, role);
        }
        else
        {
            //get from cache  at first
            //if absent call _employeeRepository.GetEmployee and add to cache
            //...
        }
    }

But when wanted to write unit tests for this class i couldn't do it
If i implement cache with Decorator pattern then i would have the following code

 public class DecoratorEmployeeRepository : IEmployeeRepository
{
    private IEmployeeRepository _employeeRepository;
    public DecoratorEmployeeRepository(IEmployeeRepository repository)
    {
        _employeeRepository = repository;
    }

    private MemoryCache _cache = new MemoryCache("UsualCache");
    public Employee GetEmployee(string firstName, string role)
    {
        //do not cache administrators
        if (role == "admin")
        {
            return _employeeRepository.GetEmployee(firstName, role);
        }
        else
        {
            //get from cache  at first
            //if absent call _employeeRepository.GetEmployee and add to cache
            return null;
        }
    }
}

and unit tests for it

 [TestClass]
public class EmployeeRepositoryTests
{
    [TestMethod]
    public void GetEmployeeTest_AdminRole()
    {
        var innerMock = Substitute.For<IEmployeeRepository>();
        var employeeRepository = new DecoratorEmployeeRepository(innerMock);
        employeeRepository.GetEmployee("Ihor", "admin");
        innerMock.Received().GetEmployee(Arg.Any<string>(), Arg.Any<string>());
    }

    [TestMethod]
    public void GetEmployeeTest_NotAdminRole()
    {
        var innerMock = Substitute.For<IEmployeeRepository>();
        var employeeRepository = new DecoratorEmployeeRepository(innerMock);
        employeeRepository.GetEmployee("Ihor", "NotAdmin");
        innerMock.DidNotReceive().GetEmployee("Ihor", "NotAdmin");
    }
}

Is it possible to write unit tests for first approach with proxy pattern ? i just don't understand how it is possible to cover proxy class with unit tests ...

Aucun commentaire:

Enregistrer un commentaire