在VS2012中编写单元测试用例

本文关键字:单元 测试用例 VS2012 | 更新日期: 2023-09-27 17:50:46

我是使用VS2012编写单元测试用例的新手。

有人能帮我写下面的方法单元测试用例吗?

public myclasstype getEmployeeById(int empid)
{
    // this method will return employee objects
}

在VS2012中编写单元测试用例

只是对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管理器控制台的项目列表中选择了您的测试项目。

  1. 假设你已经定义了如下的类

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

    }

  2. 添加UnitTest到您的UnitTest项目右键单击单元测试项目,添加->单元测试。下面是基于上述类的单元测试示例代码。

    使用系统;使用Microsoft.VisualStudio.TestTools.UnitTesting;使用Moq;

UnitTestProject1

名称空间{(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);
    }
}

}

  1. 右键单击要编写单元测试的方法> Create UnitTest…
  2. 在创建单元测试对话框中
  3. 勾选要为哪些方法生成单元测试:
  4. [好]
  5. 输入测试项目的名称
  6. (创建)

使用Assert类检查结果