我的数据访问层上有一个方法可以将任何函数作为搜索条件,并针对我们的实体框架实体运行此方法。我正在尝试使用业务层上的Rhino Mocks创建单元测试,但这会调用DAL方法。当我尝试为此搜索方法创建存根时,我似乎无法让它正确运行。我有以下需要存根的方法:
IQueryable<T> AllSearchBy<T>(params Expression<Func<T, bool>>[] search) where T : class;
我似乎无法为函数找到使用Arg.Is.Anything
这样的通用表达式,所以我尝试设置自己的表达式。我有以下内容,如果Id为1,则应返回_fakeObjs中的第一个值,如果Id为0,则应返回null(两个单独的测试):
myObjId = 1; // or 0 for returning a null
System.Linq.Expressions.Expression<Func<MyObj, bool>> myFunc = (a => a.Id == objId);
IRepository repositoryMock = MockRepository.GenerateMock<IRepository>();
repositoryMock.Stub(x => x.AllSearchBy<MyObj>(myFunc)).Return(_fakeObjs.Where(x => x.Id == myObjId));
但是,我收到以下错误。对于应该返回一个对象的那个(值= 1):
Message: Test method
NS.MyApp.Test.ObjTest.SearchById_ReturnsObj threw exception:
System.ArgumentNullException: Value cannot be null.
Parameter name: source
对于应该返回null(value = 0)的那个:
Message: Test method
NS.MyApp.Test.ObjTest.SearchById_ReturnsNull threw exception:
Rhino.Mocks.Exceptions.ExpectationViolationException:
IRepository.AllSearchBy<NS.EF.MyObj>([]); Expected #1, Actual #0.
设置参数以传递到我的存储库中的AllSearchBy需要做什么?
提前感谢您的帮助!!
答案 0 :(得分:1)
如果您尝试将以下内容作为参数传递而不是当前myFunc
:
Arg<Expression<Func<MyObj, bool>>[]>.Is.Anything