c# - Personalizando el generador de AutoFixture con propiedad sembrada
(1)
Antes de sumergirme en responder las preguntas específicas, me gustaría señalar algo que podría ser mucho más sencillo: podría considerar simplemente asignar valores a esas propiedades de escritura después de llamar a CreateMany, pero antes de devolver el resultado.
Algo como esto:
var transactionViews = fixture.CreateMany<TransactionView>(transactionsToReturnCount);
foreach (var tv in transactionViews)
{
tv.ViewKey.TransactionId = beginningTransactionId++;
tv.TransactionDate = DateTime.Now - new TimeSpan(random.Next(30),0,0,0);
}
return transactionViews.OrderBy(t => t.TransactionDate).ToArray();
Esto puede parecer un hack, pero realmente no lo es. AutoFixture está diseñado para crear valores anónimos, de modo que cada vez que intente asignar valores específicos (que actualmente es), se está alejando de su propósito original.
No me malinterpretes: es genial que uses AutoFixture de esta manera. A veces también tengo que asignar algunos valores específicos a algunos miembros de las muestras que he creado AutoFixture, pero tiendo a usar la técnica anterior, porque la API .NET normal de los captadores y definidores ya está especializada en hacer exactamente eso . AutoFixture, por otro lado, se especializa en definir reglas para ser vago, por lo que su propósito es el opuesto.
Dicho esto, sin embargo, ahora responderé las preguntas específicas planteadas anteriormente:
Pregunta 1
No he intentado compilar esto, así que es posible que tengas que modificarlo un poco, pero lo mejor que puedes hacer es algo como esto:
fixture.Customize<TransactionViewKey>(ob => ob
.Without(t => t.TransactionId)
.Do(t => t.TransactionId = beginningTransactionId++)
.With(t => t.TransactionIdSpecified, true)
.OmitAutoProperties());
Pregunta 2
El segundo parámetro del método With no es un delegado, es un valor por lo que solo se evalúa una vez.
Para evaluarlo cada vez, puedes usar el mismo truco que el anterior:
fixture.Customize<TransactionView>(ob => ob
.Without(t => t.TransactionDate)
.Do(t => t.TransactionDate = DateTime.Now - new TimeSpan(random.Next(30),0,0,0))
.With(t => t.PostDate, DateTime.Now - new TimeSpan(random.Next(30), 0, 0, 0))
.With(t => t.ViewKey)
.With(t => t.Amount)
.OmitAutoProperties());
Por favor, hágamelo saber si tiene alguna pregunta adicional.
HTH
Tengo un generador de autofijación personalizado para una prueba de integración. El código está abajo.
Pregunta 1: en la actualidad, la primera transacción tiene un TransactionViewKey.TransactionId de 1, etc. ¿Cómo configuro el TransactionViewKey TransactionId para que se extraiga del método param beginTransactionId? por ejemplo, devolviendo una matriz de TransactionViews donde el primer TransactionId es 200, ¿y luego cada incremento en 1?
Pregunta 2: la lambda para determinar la fecha de la transacción parece ejecutarse solo una vez, por lo que cada fecha tiene el mismo valor. ¿Cómo configuro el generador para que ejecute el generador de fechas aleatorias para cada instancia generada en lugar de una sola vez?
Gracias
static TransactionView[] CreateTransactions(int transactionsToReturnCount, long beginningTransactionId) {
Random random = new Random();
IFixture fixture = new Fixture();
fixture.Customize<TransactionViewKey>(ob => ob
.With(t => t.TransactionId)
.With(t => t.TransactionIdSpecified, true)
.OmitAutoProperties()
);
fixture.Customize<TransactionView>(ob => ob
.With(t => t.TransactionDate, DateTime.Now - new TimeSpan(random.Next(30),0,0,0))
.With(t => t.PostDate, DateTime.Now - new TimeSpan(random.Next(30), 0, 0, 0))
.With(t => t.ViewKey)
.With(t => t.Amount)
.OmitAutoProperties()
);
IEnumerable<TransactionView> transactionViews = fixture.CreateMany<TransactionView>(transactionsToReturnCount);
return transactionViews.OrderBy(t => t.TransactionDate).ToArray();
}