使用Moq.dll的C#单元测试模拟

本文关键字:单元测试 模拟 Moq dll 使用 | 更新日期: 2023-09-27 18:20:08

我的测试用例总是失败,告诉我哪里错了,代码低于

public class EmployeeService
{
    private readonly IRepository _repository;
    public EmployeeService(IRepository repository)
    {
        _repository = repository;
    }
    public bool SaveEmployeeData(Employee employee,bool isSaveNeeded)
    {
        bool result = false;
        try
        {
            if (isSaveNeeded)
            {
                result= _repository.Save(employee);
            }
        }
        catch (Exception ex)
        {
            throw new Exception();
        }
        return result;
    }
}

我的测试用例是

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    a.Setup(s => s.Save(new Employee())).Returns(true).Verifiable();
    var result = new EmployeeService(a.Object).SaveEmployeeData(new Employee(), true);
    Assert.IsTrue(result);
}

它总是失败。

使用Moq.dll的C#单元测试模拟

使用It.IsAny<Employee>设置保存方法参数

a.Setup(s => s.Save(It.IsAny<Employee>())).Returns(true).Verifiable();

测试不起作用的原因是您有两个不同的雇员实例——一个用于模拟设置,另一个传递给SaveEmployeeData方法调用。默认情况下,这些实例将通过引用进行比较。Moq等待具有employee实例的Save方法调用,该实例具有引用13(例如)。但您正在传递另一个具有引用42的employees。因此,安装程序永远不会被调用。

你还有两个选项

  • 重写CCD_ 6类的CCD_ 4和CCD_。因此,Moq将不通过参考,而是通过业务数据对员工进行比较
  • 将完全相同的employee实例用于mock设置和SaveEmployeeData方法调用(首选方式)

使用同一员工实例:

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    var sameEmployee = new Employee();
    a.Setup(s => s.Save(sameEmployee)).Returns(true).Verifiable();
    var service = new EmployeeService(a.Object);
    var result = service.SaveEmployeeData(sameEmployee, true);
    Assert.IsTrue(result);
}

压倒平等:

public class Employee
{
    public override bool Equals(object obj)
    {
        Employee other = obj as Employee;
        if (other == null)
            return false;
        return this.Id == other.Id; // for example
    }
}

在这种情况下,您可以保持测试原样。

new Employee()每次都会创建一个新的员工实例,一个用于Save的设置,另一个用于实际的SaveEmployeeData。因此,提供的员工永远无法满足设置的要求。

要么使用像lazybrezovsky的答案那样的包罗万象的方法,要么执行以下操作:

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    var employee = new Employee();
    a.Setup(s => s.Save(employee)).Returns(true).Verifiable();
    var result = new EmployeeService(a.Object).SaveEmployeeData(employee, true);
    Assert.IsTrue(result);
}

由于设置中使用的Employee实例与实际调用中使用的相同,因此设置匹配并返回正确的结果。

试试这个-

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
var employee = new Employee();
    a.Setup(s => s.Save(employee)).Returns(true).Verifiable();
    var result = new EmployeeService(a.Object).SaveEmployeeData(employee, true);
    Assert.IsTrue(result);
}

您需要在设置和方法调用中使用相同的雇员实例。这将确保验证您使用的是在方法中传递的同一个雇员实例,而不是在方法中创建或从另一个方法返回的实例。