使用规范模式和工作单元进行单元测试不会在设置时返回数据

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());