FLS*_*LSH 9 c# unit-testing encapsulation moq 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; }
}
Run Code Online (Sandbox Code Playgroud)
District属性是数据库中的计算列.由于数据访问提供程序(实体框架)的要求,需要私有集.这在正常的程序流程中很好,因为区域永远不需要设置,因为在数据库中保存/更新地址记录时它会被更新
我想测试的方法如下所示:
public IEnumerable<House> GetHousesWithinSameDistrict (int addressId)
{
var addressToMatch = _addressRepository
.FirstOrDefault(address => address.Id == addressId)
return _houseRepository
.Where(house => house.Address.District == addressToMatch.District)
}
Run Code Online (Sandbox Code Playgroud)
当我尝试设置addressToMatch变量时,这会导致我出现问题,因为我无法设置District属性,因此我无法编写测试来检查是否返回了正确的匹配地址.
我该如何设置此测试的Address对象?
如果您正在使用Moq(问题标记为,所以我假设您是),这可以开箱即用:
var mockAddress = new Mock<Address>();
mockAddress.SetupGet(p => p.District).Returns("Whatever you want to match");
Run Code Online (Sandbox Code Playgroud)
所以一个更完整的例子是:
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);
Run Code Online (Sandbox Code Playgroud)
这会输出预期值:
What you want to match
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3742 次 |
| 最近记录: |