2016-04-29 109 views
8

Attualmente in una parte del mio progetto un oggetto di dominio come qui di seguito: esisteproprietà di test con setter privati ​​

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

proprietà Il Distretto è una colonna calcolata nel database. A causa dei requisiti del fornitore di accesso ai dati (Entity Framework) è richiesto un set privato. Questo va bene nel flusso normale di programma come mai ha bisogno del Distretto essere impostato, a causa di essa in fase di aggiornamento quando un record di indirizzo viene salvato/aggiornato nel database

Un metodo che voglio prova si presenta così:

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

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

Questo mi crea problemi quando cerco di impostare la variabile addressToMatch, in quanto non riesco a impostare la proprietà District e come tale non posso scrivere un test per verificare che vengano restituiti gli indirizzi corrispondenti corretti.

Come devo impostare la configurazione di un oggetto Indirizzo per questo test?

+0

Forse, 'protetta internal' +' assemblea: InternalsVisibleTo'? –

+0

@ DeblatonJean-Philippe Correlato, ma sicuramente nessun duplicato IMHO. – Jeroen

+0

@ DeblatonJean-Philippe Niente affatto un duplicato di quello. – FLSH

risposta

5

Questo funziona out of the box, se si sta utilizzando Moq (che la questione è codificata con, quindi suppongo che voi siate):

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

Così un esempio più completo è il seguente:

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

emette il valore atteso:

What you want to match 
1

In primo luogo, un ipotesi: forse una combinazione di dichiarare il vostro District propery come protected internal più aggiungendo un attributo assembly:InternalsVisibleTo alla vostra assemblea "dominio" in modo che Distinct potrebbe essere impostato dai vostri test.

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

In alternativa, è possibile aggiungere un costruttore interna alla classe Address, che impostare il valore della proprietà District. E ancora, annota il tuo assembly "dominio" con assembly:InternalsVisibleTo.