c# - 使用私有(private) setter 测试属性

标签 c# unit-testing moq encapsulation access-modifiers

目前在我项目的一部分中存在如下域对象:

public class Address
{
    public virtual string HouseName { get; set; }

    public virtual string HouseNumber { get; set; }

    public virtual string RoadName { get; set; }

    public virtual string Postcode { get; set; }

    public virtual string District { get; private set; }
}

District 属性是数据库中的计算列。由于数据访问提供程序( Entity Framework )的要求,需要一个私有(private)集。这在正常程序流程中很好,因为不需要设置地区,因为它会在数据库中保存/更新地址记录时更新

我要测试的方法如下所示:

public IEnumerable<House> GetHousesWithinSameDistrict (int addressId)
{
    var addressToMatch = _addressRepository
      .FirstOrDefault(address => address.Id == addressId)

    return _houseRepository
      .Where(house => house.Address.District == addressToMatch.District)
}

当我尝试设置 addressToMatch 变量时,这给我带来了问题,因为我无法设置 District 属性,因此我无法编写测试来检查是否返回了正确的匹配地址。

我应该如何为这个测试设置地址对象?

最佳答案

如果您使用的是 Moq(问题已标记,所以我假设您是),这可以开箱即用:

var mockAddress = new Mock<Address>();
mockAddress.SetupGet(p => p.District).Returns("Whatever you want to match");

所以一个更完整的例子是:

var mockAddress = new Mock<Address>();
mockAddress.SetupGet(p => p.Id).Returns(42);
mockAddress.SetupGet(p => p.District).Returns("What you want to match");

var mockAddressRepository = new Mock<IRepository<Address>>();
var addresses = new List<Address> { mockAddress.Object };
mockAddressRepository.Setup(p => p.GetEnumerator()).Returns(addresses.GetEnumerator());

var addressToMatch = mockAddressRepository.Object.FirstOrDefault(address => address.Id == 42);
Console.WriteLine(addressToMatch.District);

这会输出期望值:

What you want to match

关于c# - 使用私有(private) setter 测试属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36938721/

相关文章:

java - 如何为 toString() 方法编写 junit 测试用例

c# - 这应该被 mock 还是被打断?

c# - 如何使用 Moq、Xunit 模拟只有具体类的第三方库

c# - 使用 Mock 进行 Nunit 测试。接口(interface)实例

c# - 玩家相机瞄准/锁定另一个物体

c# - ML.NET 二元分类模型不起作用

c# - 将多个 ComboBoxes 绑定(bind)到同一个 ItemsSource 会导致问题

c# - 应用洞察监控

unit-testing - 单元测试覆盖率未显示在 Sonarqube 上 - 通过 Jenkins Sonar 插件运行 - 测试成功显示正确

java - 如何模拟 KerberosTicket 实例?