Moq工作单位
我是unit testing的新手,我想为我的搜索function创建一个测试。 我的服务层看起来像:
public class EmployeeService: BaseService, IEmployeeService { public EmployeeService(IUnitOfWork unitOfWork) : base(unitOfWork) { _employeeRepo = unitOfWork.EmployeeRepository; } public IEnumerable Search(Employee advancedSearch, int[] divisionIds, bool showInactive, int pageSize, int? page) { return _employeeRepo.Search(advancedSearch, divisionIds, showInactive, pageSize, page); } }
unit testing:
[Test] public void SearchShouldFilterActiveEmployees() { var employees = new List { 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(); 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
。 我如何moq UnitOfWork
以便我可以测试从搜索返回正确数量的员工。
对于IEmployeeRepo
存储库,最简单的方法是为它创建一个接口,例如IEmployeeRepo
。 然后在EmployeeService
类中,该字段将是private readonly IEmployeeRepo _employeeRepo
。
在测试中,您可以validation是否已调用Search
。
bool searchwasCalled = false; Mock repositoryMock = new Mock (); repositoryMock.Setup(r => r.Search( It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .Callback(() => searchwasCalled = true); var mockUnitOfWork = new Mock(); 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.");