2016-04-29 13 views
8

Obecnie w ramach mojego projektu obiektu domeny jak poniżej istnieje:właściwości Testowanie z prywatnymi ustawiaczy

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

własność Powiatu obliczona kolumna w bazie danych. Ze względu na wymagania dostawcy dostępu do danych (Entity Framework) wymagany jest zestaw prywatny. Jest to dobre rozwiązanie w normalnym przebiegu programu jako dzielnica nie musi być ustawiony, ze względu na to aktualizowany, gdy rekord Adres jest zapisany/aktualizowane w bazie

Sposób, że chcę testu wygląda następująco:

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

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

Powoduje to problemy podczas próby ustawienia zmiennej addressToMatch, ponieważ nie jestem w stanie ustawić właściwości District i jako taka nie mogę napisać testu sprawdzającego, czy zwracane są poprawne pasujące adresy.

W jaki sposób powinienem wykonać konfigurację obiektu Adres dla tego testu?

+0

Może '' chroniony internal' + montaż: InternalsVisibleTo'? –

+0

@ DeblatonJean-Philippe Podobne, ale na pewno nie duplikaty IMHO. – Jeroen

+0

@ DeblatonJean-Philippe Wcale nie jest to duplikat tego. – FLSH

Odpowiedz

5

ta działa po wyjęciu z pudełka, jeśli używasz Min (której pytanie jest oznaczony, więc zakładam, że jesteś):

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

Więc bardziej kompletny przykładem jest:

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

ten wyprowadza oczekiwaną wartość:

What you want to match 
1

pierwsze, dzikie przypuszczenie: być może połączenie deklarując swoją propery District jako protected internal oraz dodanie atrybutu assembly:InternalsVisibleTo do „domeny” zespołu tak, że Distinct mógłby być ustawiony od swoich testów.

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

Alternatywnie, można dodać wewnętrzną konstruktora klasy Address, które należy ustawić wartość właściwości District. Ponownie zanotuj swój zespół "domeny", używając assembly:InternalsVisibleTo.

Powiązane problemy