我正在尝试测试一种服务方法,但为了做到这一点,我必须模拟我的 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();
}
}