使用 Rhino Mocks 存根存储库对象的函数表达式
Stubbing function expression of repository object using Rhino Mocks
我正在使用 Rhino Mocks 对进行以下调用的服务方法进行单元测试:
var form = Repo.GetOne<Form>(f => f.Id == formId, "FormTemplate, Event");
Repo.GetOne 方法签名是:
TEntity GetOne<TEntity>(
Expression<Func<TEntity, bool>> filter = null,
string includeProperties = null)
where TEntity : class, IEntity;
到目前为止,我只能通过忽略函数表达式参数来做到这一点:
_mockRepo.Stub(
r =>
r.GetOne<Form>(
Arg<Expression<Func<Form, bool>>>.Is.Anything,
Arg<string>.Is.Equal("FormTemplate, Event")))
.Return(form);
如何存根 Repo.GetOne 方法以便在使用参数 f => f.Id == formId, "FormTemplate, Event"
调用方法时设置 return 值?
当您设置 Stub/Mocks 时,用于参数的值在您调用 mockArg.Equals(runtimeArg)
时必须 return 为真。你的 Func<>
不会这样做,所以你最好的选择是使用 Arg<T>.Matches()
约束,它采用一个函数,如果给定存根输入,returns true 如果运行时输入匹配。
不幸的是,查看 Func<T>
委托的内容并不简单。 (看看)
var myArgChecker = new Function<Expression<Func<Form, bool>>, bool>(input =>
{
//inspect input to determine if it's a match
return true; //or false if you don't want to apply this stub
});
_mockRepo.Stub(
r =>
r.GetOne<Form>(
Arg<Expression<Func<Form, bool>>>.Matches(input => myArgChecker(input)),
Arg<string>.Is.Equal("FormTemplate, Event")))
.Return(form);
我正在使用 Rhino Mocks 对进行以下调用的服务方法进行单元测试:
var form = Repo.GetOne<Form>(f => f.Id == formId, "FormTemplate, Event");
Repo.GetOne 方法签名是:
TEntity GetOne<TEntity>(
Expression<Func<TEntity, bool>> filter = null,
string includeProperties = null)
where TEntity : class, IEntity;
到目前为止,我只能通过忽略函数表达式参数来做到这一点:
_mockRepo.Stub(
r =>
r.GetOne<Form>(
Arg<Expression<Func<Form, bool>>>.Is.Anything,
Arg<string>.Is.Equal("FormTemplate, Event")))
.Return(form);
如何存根 Repo.GetOne 方法以便在使用参数 f => f.Id == formId, "FormTemplate, Event"
调用方法时设置 return 值?
当您设置 Stub/Mocks 时,用于参数的值在您调用 mockArg.Equals(runtimeArg)
时必须 return 为真。你的 Func<>
不会这样做,所以你最好的选择是使用 Arg<T>.Matches()
约束,它采用一个函数,如果给定存根输入,returns true 如果运行时输入匹配。
不幸的是,查看 Func<T>
委托的内容并不简单。 (看看)
var myArgChecker = new Function<Expression<Func<Form, bool>>, bool>(input =>
{
//inspect input to determine if it's a match
return true; //or false if you don't want to apply this stub
});
_mockRepo.Stub(
r =>
r.GetOne<Form>(
Arg<Expression<Func<Form, bool>>>.Matches(input => myArgChecker(input)),
Arg<string>.Is.Equal("FormTemplate, Event")))
.Return(form);