2016-04-29 4 views
8

Zur Zeit in einem Teil meines Projektes wie unten ein Domain-Objekt vorhanden ist:Testing Eigenschaften mit privaten Setter

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

Kreis Eigenschaft ist eine berechnete Spalte in der Datenbank. Aufgrund der Anforderungen des Datenzugriffsanbieters (Entity Framework) wird ein privates Set benötigt. Das ist in Ordnung im normalen Programmablauf wie der Kreis muss nie eingestellt werden, weil es aktualisiert wird, wenn ein Adressdatensatz wird wie folgt aussieht in der Datenbank

Eine Methode, die ich testen mag gespeichert/aktualisiert:

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

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

Das verursacht mir Probleme, wenn ich versuche, die addressToMatch-Variable einzurichten, da ich die District-Eigenschaft nicht festlegen kann und als solche kann ich keinen Test schreiben, um korrekte übereinstimmende Adressen zu überprüfen.

Wie sollte ich ein Adressobjekt für diesen Test einrichten?

+0

Vielleicht 'protected internal' +' Montage: InternalsVisibleTo'? –

+0

@ DeblatonJean-Philippe Related, aber sicherlich kein Duplikat IMHO. – Jeroen

+0

@ DeblatonJean-Philippe Gar nicht ein Duplikat davon. – FLSH

Antwort

5

Das aus der Box funktioniert, wenn Sie verwenden Moq (das ist die Frage mit markiert ist, so dass ich nehme an, Sie sind):

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

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

So ein vollständigeres Beispiel ist

Dies gibt den Erwartungswert:

What you want to match 
1

Zuerst wird eine wilde Vermutung: vielleicht eine Kombination aus Ihrer District propery als protected internal deklarieren und das Hinzufügen ein assembly:InternalsVisibleTo Attribut zu Ihrer „Domäne“ Montag, so dass Distinct von Ihren Tests festgelegt werden konnte.

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

Alternativ können Sie einen internen Konstruktor Ihre Address Klasse hinzufügen, die den Wert der District Eigenschaft festgelegt würde. Und noch einmal, notieren Sie Ihre "Domain" -Baugruppe mit assembly:InternalsVisibleTo.

Verwandte Themen