FailedUnitTest
FailedUnitTest

Reputation: 1800

Making this method Generic with variable parameter

Is there any creative way to make this method Generic, I hate having to copy-paste it everywhere:

private CoachContext GetMockContext(Mock<DbSet<LastViewedRecord>> mockSet) {
  var autoFixture = new Fixture();
  DbContextOptions<CoachContext> options = autoFixture
    .Build<DbContextOptions<CoachContext>>()
    .Create();
  var mockContext = new Mock<CoachContext>(options);
  mockContext.Setup(c => c.LastViewedRecords).Returns(mockSet.Object);
  return mockContext.Object;
}

I can make the LastViewedRecord into T and make the method Generic, but I cannot get around c => c.LastViewedRecords

Solution: I changed the method signature to something like this:

protected CreditCoachContext GetMockContext<T>(
  IQueryable<T> mockData,
  Expression<Func<CreditCoachContext,
  DbSet<T>>> contextExpression
) where T : class

Upvotes: 2

Views: 63

Answers (1)

Derviş Kayımbaşıoğlu
Derviş Kayımbaşıoğlu

Reputation: 30565

something like this might help. (PS: I am not sure about Fixture)

private TReturn GetMockContext<TContext, TEntity, TReturn>(Mock<DbSet<TEntity>> mockSet, 
  Expression<Func<CreditCoachContext>> contextExpression) 
    where TContext : DbContext, new() 
    where TEntity : class 
    where TReturn : class
{
  var autoFixture = new Fixture();
  DbContextOptions<TContext> options = autoFixture
    .Build<DbContextOptions<TContext>>()
    .Create();
  var mockContext = new Mock<TContext>(options);
  mockContext.Setup(contextExpression).Returns(mockSet.Object);
  return mockContext.Object;
}

Upvotes: 1

Related Questions