0

我正在尝试测试一种服务方法,但为了做到这一点,我必须模拟我的 ReportRepository。一切正常,除了对 Include 方法的调用使模拟返回 null。

以下返回预期的报告:

var report = new Report();
var reportRepoMock = Substitute.For<IReportRepository>();
reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));

但该服务实际上执行以下操作:

var report = await reportRepo.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync();

问题是,当我在我的模拟中包含“包含”方法时,会返回 null 而不是预期的报告,因此我的测试会中断NullReferenceException

var reportRepoMock = Substitue.For<IReportRepository>();
reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));

那么如何在我的模拟中包含“包含”方法?

我正在尝试使用流利的存储库,因此它们的设置有所不同。以下许多代码发生在抽象的通用类中,但我将其删除以缩短问题长度。

public class ReportRepository : IReportRepository
{
    private readonly IDbSet _dbSet;

    public ReportRepository(IDbContext context) {
        _dbSet = context.Set<Report>();
    }

    void Add(Report report) { ... }
    void Remove(Report report) { ... }
    ...

    public IReportQueryBuilder Query() {
        return new ReportQueryBuilder(_dbSet.AsQueryable());
    }
}

public class ReportQueryBuilder : IReportQueryBuilder
{
    private IQueryable<Report> _query;

    public ReportQueryBuilder(IQueryable<Report> query) {
        _query = query;
    }

    public IReportQueryBuilder ByReportType(ReportType reportType) {
        _query = _query.Where(m => m.ReportType == reportType);

        return this;
    }

    public IReportQueryBuilder Include<T>(Expression<Func<Report, T>> property) {
        _query = _query.Include(property);

        return this;
    }

    public async Task<Report> ToEntityAsync() {
        return await _query.FirstOrDefaultAsync();
    }
}
4

1 回答 1

0

想出了这个。而不是将模拟设置为:

 reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));

我去了:

reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(Arg.Any<Expression<Func<Report, Collection<ReportField>>>>())
    .ToEntityAsync()
    .Returns(Task.FromResult(report));
于 2014-06-12T21:24:10.080 回答