C# 最小起订量工作单位
我不熟悉单元测试,我想为我的搜索功能创建一个测试。我的服务层看起来像:C# 最小起订量工作单位,c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我不熟悉单元测试,我想为我的搜索功能创建一个测试。我的服务层看起来像: public class EmployeeService: BaseService, IEmployeeService { public EmployeeService(IUnitOfWork unitOfWork) : base(unitOfWork) { _employeeRepo = unitOfWork.EmployeeRepository; } public IEn
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);
}
}
public类EmployeeService:BaseService、ieemployeeservice
{
公共雇员服务(IUnitOfWork unitOfWork):基础(unitOfWork)
{
_employeeRepo=unitOfWork.EmployeeRepository;
}
公共IEnumerable搜索(员工高级搜索,int[]部门ID,bool showInactive,int pageSize,int?page)
{
返回_employeeRepo.Search(高级搜索、部门ID、showInactive、页面大小、页面);
}
}
单元测试:
[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);
}
[测试]
公共无效搜索应筛选活动员工()
{
var员工=新名单
{
新员工{EmployeeId=105,FirstName=“John”,LastName=“Smith”,IsActive=true},
新员工{EmployeeId=162,FirstName=“John”,LastName=“Doe”,IsActive=true},
新员工{EmployeeId=3,FirstName=“Jan”,LastName=“Doe”,IsActive=true}
};
var mockUnitOfWork=new Mock();
var sut=新员工服务(mockUnitOfWork.Object);
var employeeSearchCriteria=新员工
{
FirstName=“约翰”
};
var employeesreern=sut.Search(employeeSearchCriteria,null,false,25,1);
Assert.IsTrue(EmployeesReturn.Count()==2);
}
我认为问题在于模仿
UnitOfWork
。我收到一个空引用异常
。如何删除工作单元
,以便测试搜索返回的员工数量是否正确。要模拟存储库,最简单的方法是为其创建一个界面,例如IEEmployeeRepo
。然后在EmployeeService
类中,字段将是private readonly ieemployeerepo\u 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.");
boolsearchwascall=false;
Mock repositoryMock=新建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=新员工服务(mockUnitOfWork.Object);
var employeeSearchCriteria=新员工
{
FirstName=“约翰”
};
sut.Search(employeeSearchCriteria,null,false,25,1);
IsTrue(searchwastcalled,“searchwastnotcalled.”);
您需要模拟员工档案
和搜索
,尤其是。。。由于副作用,您的测试所增加的价值将比您预期的要少,因为如果数据库访问是伪造的,就不会有真正的过滤。您认为创建此测试有什么意义吗?在我的存储库测试中,我已经创建了一个类似于此的测试,除了测试中的系统
将是EmployeeRepository
,而不是EmployeeService
。我真的只想测试我的服务层是否可以在我的存储库中调用Search
方法。测试它是有意义的,它不是最可能的故障点,因为基本上没有逻辑,但您可以测试您是否使用正确的参数调用Search
。创建一个设置,仅当使用正确参数调用Search
时才返回2名员工。如果使用了不正确的参数,Search
将返回null,断言将失败