使用规范模式和工作单元进行单元测试不会在设置时返回数据
Unit Testing with Specification Pattern and Unit of Work is not returning data on setup
我有一个带有工作单元模式设置的通用存储库,以利用工作良好的规范模式,但现在我正在尝试对其进行单元测试,似乎我的设置没有 returning 任何东西指定 return.
的内容
存储库片段
internal class Repository<T> : IRepository<T> where T : BaseEntity
{
protected readonly ApplicationDbContext _context;
public Repository(ApplicationDbContext context)
{
_context = context;
}
public IEnumerable<T> Find(ISpecification<T> specification = null)
{
return ApplySpecification(specification);
}
private IQueryable<T> ApplySpecification(ISpecification<T> spec)
{
return SpecificationEvaluator<T>.GetQuery(_context.Set<T>().AsQueryable(), spec);
}
}
}
规范片段
public class GetStocksForCurrentDaySpecification : BaseSpecification<Stock>
{
public GetStocksForCurrentDaySpecification() : base(x => x.DateInserted.Day == DateTime.Today.Day) { }
}
我调用它的片段
_unitOfWork.Repository<Stock>().Find(new GetStocksForCurrentDaySpecification());
当 运行 我的代码时,这一切都完美无缺。
这是我进行设置的单元测试。
[Fact]
public void Job_Should_Execute()
{
var stockList = new List<Stock>();
stockList.Add(new Stock
{
Id = Guid.NewGuid(),
DateInserted = DateTime.Now,
Exchange = "ASX",
LongName = "Long Name",
MarketOpenPrice = 1.26M,
MarketPreviousClosePrice = 1.56M,
MarketPrice = 1.3M,
ShortName = "Short Name",
Symbol = "LGN"
});
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock.Setup(m => m.Find(new GetStocksForCurrentDaySpecification())).Returns(stockList.ToArray());
var unitOfWorkMock = new Mock<IUnitOfWork>();
unitOfWorkMock.Setup(m => m.Repository<Stock>()).Returns(stockRepositoryMock.Object).Verifiable();
var job = new YahooStockMarketJob(new HttpClient(), unitOfWorkMock.Object, new EventPublisher(_listeners), _configuration);
job.Execute();
unitOfWorkMock.Verify();
}
调试时,下一行 return 是一个空数组,而不是包含一项的数组。
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock.Setup(m => m.Find(new GetStocksForCurrentDaySpecification())).Returns(stockList.ToArray());
在您的模拟对象中,您正在使用 GetStocksForCurrentDaySpecification
的特定实例设置 Find
方法。在您的测试期间,您传递了 GetStocksForCurrentDaySpecification
的不同实例,并且由于它们不相同,因此不会使用该设置。
如果您希望您的设置与您的测试一起工作,您要么需要使用相同的实例,要么通过使用 It.IsAny<T>
.
允许该对象的任何实例
例如
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock
.Setup(m => m.Find(It.IsAny<GetStocksForCurrentDaySpecification>()))
.Returns(stockList.ToArray());
我有一个带有工作单元模式设置的通用存储库,以利用工作良好的规范模式,但现在我正在尝试对其进行单元测试,似乎我的设置没有 returning 任何东西指定 return.
的内容存储库片段
internal class Repository<T> : IRepository<T> where T : BaseEntity
{
protected readonly ApplicationDbContext _context;
public Repository(ApplicationDbContext context)
{
_context = context;
}
public IEnumerable<T> Find(ISpecification<T> specification = null)
{
return ApplySpecification(specification);
}
private IQueryable<T> ApplySpecification(ISpecification<T> spec)
{
return SpecificationEvaluator<T>.GetQuery(_context.Set<T>().AsQueryable(), spec);
}
}
}
规范片段
public class GetStocksForCurrentDaySpecification : BaseSpecification<Stock>
{
public GetStocksForCurrentDaySpecification() : base(x => x.DateInserted.Day == DateTime.Today.Day) { }
}
我调用它的片段
_unitOfWork.Repository<Stock>().Find(new GetStocksForCurrentDaySpecification());
当 运行 我的代码时,这一切都完美无缺。
这是我进行设置的单元测试。
[Fact]
public void Job_Should_Execute()
{
var stockList = new List<Stock>();
stockList.Add(new Stock
{
Id = Guid.NewGuid(),
DateInserted = DateTime.Now,
Exchange = "ASX",
LongName = "Long Name",
MarketOpenPrice = 1.26M,
MarketPreviousClosePrice = 1.56M,
MarketPrice = 1.3M,
ShortName = "Short Name",
Symbol = "LGN"
});
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock.Setup(m => m.Find(new GetStocksForCurrentDaySpecification())).Returns(stockList.ToArray());
var unitOfWorkMock = new Mock<IUnitOfWork>();
unitOfWorkMock.Setup(m => m.Repository<Stock>()).Returns(stockRepositoryMock.Object).Verifiable();
var job = new YahooStockMarketJob(new HttpClient(), unitOfWorkMock.Object, new EventPublisher(_listeners), _configuration);
job.Execute();
unitOfWorkMock.Verify();
}
调试时,下一行 return 是一个空数组,而不是包含一项的数组。
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock.Setup(m => m.Find(new GetStocksForCurrentDaySpecification())).Returns(stockList.ToArray());
在您的模拟对象中,您正在使用 GetStocksForCurrentDaySpecification
的特定实例设置 Find
方法。在您的测试期间,您传递了 GetStocksForCurrentDaySpecification
的不同实例,并且由于它们不相同,因此不会使用该设置。
如果您希望您的设置与您的测试一起工作,您要么需要使用相同的实例,要么通过使用 It.IsAny<T>
.
例如
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock
.Setup(m => m.Find(It.IsAny<GetStocksForCurrentDaySpecification>()))
.Returns(stockList.ToArray());