代码之家  ›  专栏  ›  技术社区  ›  FailedUnitTest

使用变量参数将此方法变为泛型

c#
  •  2
  • FailedUnitTest  · 技术社区  · 7 年前

    有没有什么创造性的方法可以使这个方法通用,我不想把它复制粘贴到任何地方:

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

    我可以做 LastViewedRecord 进入之内 T 并使该方法成为泛型,但我无法绕过 c => c.LastViewedRecords

    解决方案: 我把方法签名改成如下:

    protected CreditCoachContext GetMockContext<T>(
      IQueryable<T> mockData,
      Expression<Func<CreditCoachContext,
      DbSet<T>>> contextExpression
    ) where T : class
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Derviş Kayımbaşıoğlu    7 年前

    这样可能会有所帮助。(附言:我不确定 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;
    }