[英]How do you shim FirstOrDefault in EntityFramework?
使用Microsoft伪造和Entityframework,我试图为FirstOrDefault()创建一个填充。 我有一个要进行单元测试的方法,如下所示:
protected override v_Titles GetEntityByKey(Guid key)
{
var result = Context.v_Titles.FirstOrDefault(t => t.Id == key);
if ( result == null )
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return result;
}
由公共方法Get(Guid键)调用。
我设置了伪造品并填充了数据库和v_Titles集合:
public void SetUp()
{
_titles = new List<v_Titles>
{
new v_Titles
{
Id = new Guid(1,0,0,0,0,0,0,0,0,0,0),
PostedDate = new DateTime(2013,1,1),
Title = "2013-01-01"
},
new v_Titles
{
Id = new Guid(2,0,0,0,0,0,0,0,0,0,0),
PostedDate = new DateTime(2013,5,23),
Title = "2013-05-23"
},
new v_Titles
{
Id = new Guid(3,0,0,0,0,0,0,0,0,0,0),
PostedDate = new DateTime(2013,8,10),
Title = "2013-08-10"
}
};
_shimTitles = new ShimDbSet<v_Titles>();
_shimTitles.Bind(_titles);
...
_databaseShim = new shimDatabaseEntities();
_databaseShim.v_TitlesGet = () => _shimTitles.Instance;
_target = new TitlesController
{
Context = _databaseShim.Instance
};
在...更远的地方,我尝试了以下填充以使FirstOrDefault起作用:
System.Linq.Fakes.ShimEnumerableQuery<v_Titles>.AllInstances.GetEnumerator = (a) =>
{ return _titles.GetEnumerator(); };
System.Linq.Fakes.ShimQueryable.FirstOrDefaultOf1IQueryableOfM0<v_Titles>((a) =>
{
return _titles.FirstOrDefault();
});
databaseEntities.AllInstances.v_TitlesGet = (a) => _shimTitles.Instance;
我的单元测试如下:
[TestMethod]
public void Get_ReturnsOneItem_Test()
{
using (ShimsContext.Create())
{
var expected = new Guid(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
SetUp();
var result = _target.Get(expected);
}
}
运行测试时,在.FirstOrDefault()调用上出现以下异常。
用户代码HResult = -2147467261未处理System.ArgumentNullException消息=值不能为null。 参数名称:参数Source = System.Core ParamName = arguments StackTrace:at System.Linq.Expressions.Expression.RequiresCanRead(Expression expression,String paramName)at System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase方法,ExpressionType nodeKind,表达式arg ,在System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase方法,ExpressionType nodeKind,ReadOnlyCollection
1& arguments) at System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable
1自变量),在System.Linq System.Linq.Queryable.FirstOrDefault [TSource](IQueryable1 source, Expression
1谓词)处的.Expressions.Expression.Call(Expression实例,MethodInfo方法,Expression []参数)在WebSite.Web.Controllers.Api.TitlesController.GetEntityByKey (Guid键)在Controllers \\ Api \\ TitlesController.cs:第42行在System.Web.Http.OData.EntitySetController`2.Get(TKey键)在WebSite.Web.Tests.TitlesController_Tests.Get_ReturnsOneItem_Te TitlesController_Tests.cs中的st():第96行InnerException:
我如何获得FirstOrDefault返回的东西? 它甚至不必执行查询,我要测试的是我正在调用FirstOrDefault并返回它重新调整的值或当它返回null时引发异常。
阅读您的文章后,我认为我遇到了同样的问题,我不会复制并粘贴我发现并为我工作的解决方案,而是给您提供URL:
http://mylifeandcode.blogspot.com/2012/10/unit-testing-with-mock-entity-framework.html
玩得开心!!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.