【问题标题】:Moq Unit of Work最小起订量工作单位
【发布时间】:2015-10-05 19:18:10
【问题描述】:

我是单元测试的新手,我想为我的搜索功能创建一个测试。我的服务层看起来像:

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

单元测试:

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

我认为问题在于嘲笑UnitOfWork。我收到了Null Reference Exception。我怎样才能对UnitOfWork 起订量,以便我可以测试从搜索中返回的员工数量是否正确。

【问题讨论】:

  • 您需要特别模拟 EmployeeRepositorySearch... 因为副作用是您的测试增加的价值比您预期的要少,因为如果数据库访问权限为伪造的
  • 你认为创建这个测试有什么意义吗?在我的存储库测试中,我已经创建了一个类似的测试,除了System Under Test 将是EmployeeRepository 而不是EmployeeService。我真的只是想测试一下我的服务层是否可以调用我的存储库中的Search 方法。
  • 对它进行测试是有意义的,这不是最可能的故障点,因为基本上没有逻辑,但您可以测试您使用正确的参数调用Search。创建设置以仅在使用正确参数调用 Search 时返回 2 名员工。如果使用了不正确的参数,Search 将返回 null 并且您的断言将失败

标签: c# unit-testing nunit moq


【解决方案1】:

为了模拟存储库,为它创建一个接口是最简单的,例如IEmployeeRepo。然后在EmployeeService 类中,该字段将是private readonly IEmployeeRepo _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.");  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多