我有一個帶有作業單元模式設定的通用存盤庫來利用規范模式,它作業得很好,但現在我正在嘗試對其進行單元測驗,似乎我的設定在指定要回傳的內容時沒有回傳任何內容。
存盤庫片段
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();
}
除錯時,以下行回傳一個空陣列,而不是一個包含一項的陣列。
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock.Setup(m => m.Find(new GetStocksForCurrentDaySpecification())).Returns(stockList.ToArray());

uj5u.com熱心網友回復:
在您的模擬物件中,您正在Find使用GetStocksForCurrentDaySpecification. 在您的測驗期間,您正在傳遞一個不同的實體,GetStocksForCurrentDaySpecification并且由于這些實體不同,因此不會使用該設定。
如果您希望您的設定與您的測驗一起使用,您需要使用相同的實體或使用It.IsAny<T>.
例如
// Returns empty array
var stockRepositoryMock = new Mock<IRepository<Stock>>();
stockRepositoryMock
.Setup(m => m.Find(It.IsAny<GetStocksForCurrentDaySpecification>()))
.Returns(stockList.ToArray());
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/473825.html
