Sto usando moq, ef 6 e xunit. Mi trovo a scrivere questo codice ancora e ancora e ho pensato che forse avrei potuto trasformarlo in un metodo generico, ma avendo qualche problema.Come scrivere questo codice di setup EF Mock come un Boilerplate generico riutilizzabile?
public static void CreateSalesMock(List<Sale> sales, Mock<DatabaseContext> dbContextMock)
{
var data = sales.AsQueryable();
var mockSet = new Mock<DbSet<Sale>>();
mockSet.As<IQueryable<Sale>>()
.Setup(x => x.Provider)
.Returns(data.Provider);
mockSet.As<IQueryable<Sale>>()
.Setup(x => x.Expression)
.Returns(data.Expression);
mockSet.As<IQueryable<Sale>>()
.Setup(x => x.ElementType)
.Returns(data.ElementType);
mockSet.As<IQueryable<Sale>>()
.Setup(x => x.GetEnumerator())
.Returns(data.GetEnumerator());
dbContextMock.Setup(x => x.Sales).Returns(mockSet.Object);
}
Ora ho molti altri tavoli nel mio database così che se ho potuto scrivere un metodo che avrebbe preso in un elenco di tali dati e impostarlo in modo che può deridere interrogazione attraverso di esso sarebbe grande.
public static void CreateMockSet<T, TA, TB>(T dataList, TA model,
Func<TB> lambda, Mock<DatabaseContext> dbContextMock)
where T : List<T>
where TA: Mock<DbSet<TA>>
{
var data = dataList.AsQueryable();
model.As<IQueryable<T>>()
.Setup(x => x.Provider)
.Returns(data.Provider);
model.As<IQueryable<T>>()
.Setup(x => x.Expression)
.Returns(data.Expression);
model.As<IQueryable<T>>()
.Setup(x => x.ElementType)
.Returns(data.ElementType);
model.As<IQueryable<T>>()
.Setup(x => x.GetEnumerator())
.Returns(data.GetEnumerator());
dbContextMock.Setup(x => lambda);
}
Finora ce l'ho, ma non sono sicuro che funzionerà o meno. Sono bloccato passando nella parte "lambda" (x => x.Sales
per esempio) quindi non riesco nemmeno a provarlo.
Penso che si desidera modificare il 'WHERE' vincolo di introdurre un'interfaccia:' dove T: Lista '. –
Consiglierei uno sguardo al Pattern Builder vedere https://www.kenneth-truyers.net/2013/07/15/flexible-and-express-unit-tests-with-the-builder-pattern/ –
@ ToddSprang Non sono sicuro di cosa sarebbe IBase. Potresti dare più di un esempio – chobo2