2015-10-05 4 views
3

Я новичок в модульном тестировании, и я хочу создать тест для своей функции поиска. Мой уровень обслуживания выглядит примерно так:Moq Единица работы

public class EmployeeService: BaseService, IEmployeeService 
{ 
    public EmployeeService(IUnitOfWork unitOfWork) : base(unitOfWork) 
    { 
     _employeeRepo = unitOfWork.EmployeeRepository; 
    } 

    public IEnumerable<Employee> Search(Employee advancedSearch, int[] divisionIds, bool showInactive, int pageSize, int? page) 
    { 
     return _employeeRepo.Search(advancedSearch, divisionIds, showInactive, pageSize, page); 
    } 
} 

Unit Test:

[Test] 
public void SearchShouldFilterActiveEmployees() 
{ 
    var employees = new List<Employee> 
    { 
     new Employee { EmployeeId = 105, FirstName = "John", LastName = "Smith", IsActive = true }, 
     new Employee { EmployeeId = 162, FirstName = "John", LastName = "Doe", IsActive = true }, 
     new Employee { EmployeeId = 3, FirstName = "Jan", LastName = "Doe", IsActive = true } 
    }; 

    var mockUnitOfWork = new Mock<IUnitOfWork>(); 

    var sut = new EmployeeService(mockUnitOfWork.Object); 

    var employeeSearchCriteria = new Employee 
    { 
     FirstName = "John" 
    }; 

    var employeesReturned = sut.Search(employeeSearchCriteria, null, false, 25, 1); 

    Assert.IsTrue(employeesReturned.Count() == 2); 
} 

Я думаю, что вопрос с насмешливым UnitOfWork. Я получаю Null Reference Exception. Как я могу пометить UnitOfWork, чтобы я мог проверить, что правильное количество сотрудников возвращается из поиска.

+0

Вам нужно издеваться '' EmployeeRepository' и Search' в частности ..., как побочный эффект ваш тест будет добавлять меньшее значение, чем вы ожидаете, так как не будет никакой реальной фильтрации при условии доступа к базе данных не подделать –

+0

Как вы думаете, будет ли смысл создавать этот тест? В моих тестах хранилища я уже создал тест, подобный этому, кроме «System Under Test» был бы «EmployeeRepository», а не «EmployeeService». Я просто хочу проверить, что мой сервисный уровень может вызвать метод «Поиск» в моем репозитории. – Andrew

+0

имеет смысл протестировать его, это не самая вероятная точка отказа, так как в принципе нет никакой логики, но вы можете проверить, что вы называете «поиск» правильными параметрами. Создайте настройку, чтобы вернуть 2 сотрудника только тогда, когда вызывается «Поиск» с правильными параметрами. Если используются некорректные параметры, 'Поиск' возвращает значение null, и ваш assert не будет работать –

ответ

2

Для издевательств хранилища было бы проще всего создать для него интерфейс, например. IEmployeeRepo. Затем в классе EmployeeService поле будет private readonly IEmployeeRepo _employeeRepo.

В тесте вы можете подтвердить, что был вызван Search.

bool searchwasCalled = false; 
Mock<IEmployeeRepo> repositoryMock = new Mock<IEmployeeRepo>(); 
repositoryMock.Setup(r => r.Search(
    It.IsAny<Employee>(), It.IsAny<int[]>(), It.IsAny<bool>(), It.IsAny<int>(), 
    It.IsAny<int?>())) 
    .Callback(() => searchwasCalled = true); 

var mockUnitOfWork = new Mock<IUnitOfWork>(); 
mockUnitOfWork.Setup(uow => uow.EmployeeRepository).Returns(repositoryMock.Object); 

var sut = new EmployeeService(mockUnitOfWork.Object); 

var employeeSearchCriteria = new Employee 
{ 
    FirstName = "John" 
}; 

sut.Search(employeeSearchCriteria, null, false, 25, 1); 

Assert.IsTrue(searchwasCalled, "Search was not called."); 
Смежные вопросы