Pregunta Prueba de propiedades con instaladores privados


Actualmente en una parte de mi proyecto existe un objeto de dominio como el siguiente:

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 propiedad del Distrito es una columna calculada en la base de datos. Debido a los requisitos del proveedor de acceso a datos (Entity Framework) se requiere un conjunto privado. Esto está bien en el flujo normal del programa ya que el Distrito nunca necesita ser configurado, debido a que se actualiza cuando se guarda / actualiza un registro de Dirección en la base de datos.

Un método que quiero probar se ve así:

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

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

Esto me está causando problemas cuando trato de configurar la variable addressToMatch, ya que no puedo establecer la propiedad del Distrito y, como tal, no puedo escribir una prueba para verificar que se devuelvan las direcciones correctas.

¿Cómo debo hacer para configurar un objeto Address para esta prueba?


9
2018-04-29 12:45


origen


Respuestas:


Esto funciona de la caja si estás usando Moq (con el que está etiquetada la pregunta, así que supongo que lo estás):

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

Entonces un ejemplo más completo es:

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

Esto produce el valor esperado:

What you want to match

6
2018-04-29 13:46



Primero, una suposición descabellada: tal vez una combinación de declarar su District propiedad como protected internal además de agregar un assembly:InternalsVisibleTo atribuir a su ensamblado de "dominio" para que Distinct podría establecerse a partir de sus pruebas.

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

Alternativamente, puede agregar un constructor interno a su Address clase, que establecería el valor de la District propiedad. Y nuevamente, anote su ensamblado de "dominio" con assembly:InternalsVisibleTo.


1
2018-04-29 12:52