如何为代理模式编写单元测试?

时间:2016-07-20 12:31:13

标签: c# unit-testing design-patterns

感谢您的关注,时间和精力!
我有以下代码

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();
    }
}

现在我想为EmployeeRepository实现缓存。 起初我使用代理设计模式

 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
            //...
        }
    }

但是当想要为这个类编写单元测试时,我无法做到(我无法为_employeeRepository创建模拟并验证它是否被调用)
如果我使用Decorator模式实现缓存,那么我将拥有以下代码

 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;
        }
    }
}

并对其进行单元测试

 [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");
    }
}

是否可以使用代理模式为第一种方法编写单元测试?我只是不明白如何用单元测试覆盖代理类...

0 个答案:

没有答案