簡體   English   中英

使用私有setter測試屬性

[英]Testing properties with private setters

目前在我的項目的一部分中存在如下的域對象:

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屬性是數據庫中的計算列。 由於數據訪問提供程序(實體框架)的要求,需要私有集。 這在正常的程序流程中很好,因為區域永遠不需要設置,因為在數據庫中保存/更新地址記錄時它會被更新

我想測試的方法如下所示:

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屬性,因此我無法編寫測試來檢查是否返回了正確的匹配地址。

我該如何設置此測試的Address對象?

如果您正在使用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

首先,一個瘋狂的猜測:可能是將您的District屬性聲明為protected internal加上添加assembly:InternalsVisibleTo屬性到您的“域”程序集,以便可以從您的測試中設置Distinct

class Address
{
    public virtual string District { get; protected internal set; }
}

或者,您可以向Address類添加內部構造函數,該類將設置District屬性的值。 再次,使用程序集注釋您的“域”程序assembly:InternalsVisibleTo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM