我想知道除了构建一个用于模拟FormSql的包装器以外,还有其他方法吗?我知道这个方法是静态的,但是因为他们把AddEntityFrameworkInMemoryDatabase
这样的东西添加到了实体框架核心中,所以我认为可能也有解决方案,我在我的项目中使用EF Core 1.0.1。在实体框架核心中嘲笑FromSql?
我的最终目标是测试这种方法:
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基于this answer,我传递给它同一个对象,处理我能做些什么像这样:
[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)));
}
但不像SqlQuery<T>
在EF 6,FormSql<T>
在EF核心是静态扩展方法,我问这个问题,因为我觉得我可能会从错误的角度来处理这个问题,或者有可能是一个比包装更好的选择,我会很欣赏这个想法。
内部的EF核心[FromSql扩展方法](https://github.com/aspnet/EntityFramework/blob/1fa247b038927a7d7438f666dc11253f64e0432d/src/Microsoft.EntityFrameworkCore.Relational/RelationalQueryableExtensions.cs)正在为'CreateQuery'上的呼叫'IQueriable.Provider'你可以看着嘲笑,达到你想要的。 – Nkosi