在VS2012中编写单元测试用例
本文关键字:单元 测试用例 VS2012 | 更新日期: 2023-09-27 17:50:46
我是使用VS2012编写单元测试用例的新手。
有人能帮我写下面的方法单元测试用例吗?
public myclasstype getEmployeeById(int empid)
{
// this method will return employee objects
}
只是对getemployebyid方法进行测试的一般概述:
[TestMethod]
public void GetEmployeeById_Id_Employee()
{
Employee employee = mockManager.MockObject<Employee>().Object;
employee.DateOfBirth = new DateTime(1970, 1, 1, 0, 0, 0);
using (RecordExpectations recorder = new RecordExpectations())
{
var dataLayer = new DataLayer();
recorder.ExpectAndReturn(dataLayer.GetEmployeeById(1), employee);
}
var company = new Company();
Employee result = company.GetEmployeeById(1);
Assert.AreEqual(result.DateOfBirth, employee.DateOfBirth);
}
这是一个相当宽泛的问题,但让我们假设你有一个Employee
类…
public class Employee
{
private IEmployeeRepository _repo;
public Employee(IEmployeeRepository repo)
{
_repo = repo;
}
public Employee GetEmployeeById(int empid)
{
return _repo.GetEmployeeById(empid);
}
}
你的测试应该是…
[Test]
public void Employee_GetEmployee_By_Id()
{
IEmployeeRepository repo = new FakeEmployeeRepository();
var employeeClass = new Employee(repo);
var employee = employee.GetEmployeeById(1);
//verify employee detail
}
这是非常基本的,但给你一个想法。显然,您将拥有一个假员工存储库,它将返回一个预设置的员工,并且在生产中,您将拥有一个真正的IEmployeeRepository
实现,例如将连接到DB
。
public interface IEmployeeRepository
{
Employee GetEmployeeById(int id);
}
public class FakeEmployeeRepository : IEmployeeRepository
{
public Employee GetEmployeeById(int id)
{
return new Employee { ... };
}
}
这都是手写的,所以这里可能有错误…这只是一个概念
步骤如下1. 添加单元测试项目,解决方案资源管理器->添加->新建项目->从模板中选择测试->单元测试项目。2. 下载并将Reference添加到Moq库中,您可以通过下面的Nuget命令完成此操作。获取Nuget包管理器控制台,进入工具菜单->库包管理器控制台->库包管理器。这应该显示Nuget包管理器控制台附近的调试,错误窗口。
install-package Moq
当点击上面的命令时,确保您已经在Nuget Package管理器控制台的项目列表中选择了您的测试项目。
假设你已经定义了如下的类
public class Employee
{公共int Id{获取;设置;}
public string Name { get; set; }
}
公共接口IEmployeeRepository{GetById(int id);}
公共接口IUnitOfWork{T GetById(int id) where T: new();}
公共类UnitOfWork: IUnitOfWork{//IUnitOfWork的实现
//public T GetById<T>(int id) where T: new(); //{ // return new T(); //}
}
公共类EmployeeRepository: IEmployeeRepository{//你在这里注入了Unit Of Workpublic IUnitOfWork UnitOfWork {get;设置;}
public Employee GetById(int id) { // Making call to database here; return UnitOfWork.GetById<Employee>(id); }
}
添加UnitTest到您的UnitTest项目右键单击单元测试项目,添加->单元测试。下面是基于上述类的单元测试示例代码。
使用系统;使用Microsoft.VisualStudio.TestTools.UnitTesting;使用Moq;
名称空间{(TestClass)公共类EmployeeUnitTest{模拟_unitOfWork;IEmployeeRepository _employeeRepository;
//This will be called before each test
[TestInitialize]
public void SetUp()
{
_unitOfWork = new Mock<IUnitOfWork>();
_employeeRepository = new EmployeeRepository();
}
[TestMethod]
public void GetById_ShouldCallUnitOfWork()
{
//Arrange
const int Id = 1;
_unitOfWork.Setup(x => x.GetById<Employee>(It.IsAny<int>())).Verifiable();
//Act
_employeeRepository.GetById(Id);
//Assert
_unitOfWork.Verify(x => x.GetById<Employee>(Id), Times.Once());
}
[TestMethod]
public void GetById_ShouldRetrunEmployee()
{
//Arrange
const int Id = 1;
var expectedEmp = new Employee { Id = Id, Name= "Emp"};
_unitOfWork.Setup(x => x.GetById<Employee>(It.IsAny<int>())).Returns(expectedEmp) ;
//Act
var employee = _employeeRepository.GetById(Id);
//Assert
Assert.AreEqual(expectedEmp, employee);
}
}
}
- 右键单击要编写单元测试的方法> Create UnitTest… 在创建单元测试对话框中
- 勾选要为哪些方法生成单元测试: [好]
- 输入测试项目的名称 (创建)
使用Assert类检查结果