Test delle proprietà con setter privati

2

Attualmente in una parte del mio progetto esiste un oggetto dominio come sotto:

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

La proprietà District è 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 normale flusso del programma poiché il Distretto non ha mai bisogno di essere impostato, poiché viene aggiornato quando un record dell'indirizzo viene salvato / aggiornato nel database

Un metodo che voglio testare assomiglia a questo:

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 fare per impostare un oggetto Address per questo test?

    
posta FLSH 29.04.2016 - 13:24
fonte

3 risposte

1

Il tuo metodo GetHousesWithinSameDistrict utilizza un repository house e un repository di indirizzi e ha la sua logica per selezionare tra le entità restituite da questi repository. Come tale, suggerirei che la soluzione semplice è usare mocking e deridere quei repository per restituire entità del tipo appropriato, in modo da poter testare i vari scenari.

Inoltre, puoi restituire tramite i tuoi scherzi alcune entità fittizie che implementano semplicemente interfacce adeguate? per esempio. il tuo codice di esempio richiede semplicemente indirizzi ID e distretti. Di conseguenza, la tua funzionalità che devi testare ha semplicemente bisogno di oggetti che parlano in questi termini, e non oggetti completamente funzionali popolati tramite il database.

    
risposta data 29.04.2016 - 14:52
fonte
1

Ecco un esempio che sto facendo per falsificare la proprietà Id della mia entità.

        A.CallTo(() => _fakeRepository.FindAll()).Returns((new List<HighSchoolType>()).AsQueryable());
        Guid fakePublicHighSchoolId = Guid.NewGuid();
        var fakePublicHighSchool = A.Fake<HighSchoolType>();
        A.CallTo(() => fakePublicHighSchool.Id).Returns(fakePublicHighSchoolId);

Quindi fingere il repository, quindi fingere che l'entità ritorni e falsificare la proprietà che si desidera restituire.

è finto fino in fondo.

Questo esempio utilizza FakeItEasy.

    
risposta data 28.06.2016 - 23:37
fonte
0

La semplice risposta è: usa la riflessione. Ad esempio, il codice seguente crea un oggetto Address e imposta District :

var address = new Address();
typeof(Address).GetProperty("District").SetValue(address, "A district", null);

Il modo in cui lo fai nel tuo codice di test dipende da cosa è _addressRepository (ad es. è dichiarato come interfaccia?) e con quanta facilità viene deriso per fornire dati di test.

(E questa domanda in realtà avrebbe dovuto essere posta su Stack Overflow, piuttosto che qui).

    
risposta data 29.04.2016 - 14:13
fonte

Leggi altre domande sui tag