Pregunta

Tengo un constructor de autofixture personalizado para una prueba de integración. El código está debajo.

Pregunta 1 - En la actualidad, la primera transacción tiene una transacciónViewKey. becorTransactionID? por ejemplo, devolver una matriz de visiones de transacciones donde la primera transaccionId es 200, luego cada incremento por 1?

Pregunta 2: la lambda para determinar la fecha de transacción parece ejecutarse solo una vez, por lo que cada fecha es el mismo valor. ¿Cómo configuro el constructor para que ejecute el generador de fecha aleatoria 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();
  }
¿Fue útil?

Solución

Antes de sumergirme en responder las preguntas específicas, me gustaría señalar algo que podría ser mucho más fácil: puede que Considere 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 truco, pero realmente no lo es. La autofixture está diseñada para crear Valores anónimos Entonces, siempre que intente asignar valores específicos (que actualmente es), está saliendo de su propósito original.

No me malinterpreten: es genial que use una autofixtura como esta. A veces también tengo que asignar algunos valores específicos a algunos miembros de las muestras que creo que la autofixture crea, pero tiendo a usar la técnica anterior, porque la API .NET normal de Getters and Setter es ya especializado para hacer exactamente eso. La autofixture, por otro lado, está especializada para definir las reglas para ser vago, por lo que su propósito es lo contrario.

Dicho esto, sin embargo, ahora responderé las preguntas específicas presentadas anteriormente:

Pregunta 1

No he tratado de compilar esto, por lo que es posible que tengas que modificarlo un poco, pero lo mejor que puedes hacer sería 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 al método con el método es no un delegado: es un valor Entonces solo se está evaluando una vez.

Para evaluarlo cada vez, puede 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());

Avíseme si tiene alguna pregunta adicional.

Hth

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top