我想知道除了构建包装器以模拟
我的最终目标是测试这个方法:
FromSql
之外,是否还有其他方法?我知道这个方法是静态的,但是因为他们在entity framework core中添加了像AddEntityFrameworkInMemoryDatabase
这样的东西,所以我认为这也可能有解决方案。 我在我的项目中使用EF Core 1.0.1。我的最终目标是测试这个方法:
public List<Models.ClosestLocation> Handle(ClosestLocationsQuery message)
{
return _context.ClosestLocations.FromSql(
"EXEC GetClosestLocations {0}, {1}, {2}, {3}",
message.LocationQuery.Latitude,
message.LocationQuery.Longitude,
message.LocationQuery.MaxRecordsToReturn ?? 10,
message.LocationQuery.Distance ?? 10
).ToList();
}
我希望查询使用我传递的相同对象进行处理,基于这个答案在实体框架6中,我可以像这样做:
[Fact]
public void HandleInvokesGetClosestLocationsWithCorrectData()
{
var message = new ClosestLocationsQuery
{
LocationQuery =
new LocationQuery {Distance = 1, Latitude = 1.165, Longitude = 1.546, MaxRecordsToReturn = 1}
};
var dbSetMock = new Mock<DbSet<Models.ClosestLocation>>();
dbSetMock.Setup(m => m.FromSql(It.IsAny<string>(), message))
.Returns(It.IsAny<IQueryable<Models.ClosestLocation>>());
var contextMock = new Mock<AllReadyContext>();
contextMock.Setup(c => c.Set<Models.ClosestLocation>()).Returns(dbSetMock.Object);
var sut = new ClosestLocationsQueryHandler(contextMock.Object);
var results = sut.Handle(message);
contextMock.Verify(x => x.ClosestLocations.FromSql(It.IsAny<string>(), It.Is<ClosestLocationsQuery>(y =>
y.LocationQuery.Distance == message.LocationQuery.Distance &&
y.LocationQuery.Latitude == message.LocationQuery.Latitude &&
y.LocationQuery.Longitude == message.LocationQuery.Longitude &&
y.LocationQuery.MaxRecordsToReturn == message.LocationQuery.MaxRecordsToReturn)));
}
但是与EF 6中的SqlQuery<T>
不同,EF Core中的FromSql<T>
是静态扩展方法。我之所以提出这个问题,是因为我认为我可能从错误的角度处理了这个问题,或者可能存在更好的替代方案而不是使用包装器,非常感谢任何关于此问题的想法。
IQueriable.Provider
上调用了CreateQuery
方法,你可以模拟这个过程来实现你想要的功能。 - Nkosi