C# 使用Rhino Mock的存储库对象的存根函数表达式

C# 使用Rhino Mock的存储库对象的存根函数表达式,c#,mocking,rhino-mocks,C#,Mocking,Rhino Mocks,我正在使用Rhino Mock对一个服务方法进行单元测试,该方法进行以下调用: var form = Repo.GetOne<Form>(f => f.Id == formId, "FormTemplate, Event"); var form=Repo.GetOne(f=>f.Id==formId,“FormTemplate,Event”); Repo.GetOne方法签名为: TEntity GetOne<TEntity>( Expr

我正在使用Rhino Mock对一个服务方法进行单元测试,该方法进行以下调用:

var form = Repo.GetOne<Form>(f => f.Id == formId, "FormTemplate, Event");
var form=Repo.GetOne(f=>f.Id==formId,“FormTemplate,Event”);
Repo.GetOne方法签名为:

TEntity GetOne<TEntity>(
            Expression<Func<TEntity, bool>> filter = null,
            string includeProperties = null)
            where TEntity : class, IEntity;
TEntity GetOne(
表达式筛选器=空,
字符串includeProperties=null)
其中张力:阶级性、张力;
到目前为止,我只通过忽略函数表达式参数实现了这一点:

_mockRepo.Stub(
    r => 
    r.GetOne<Form>(                    
      Arg<Expression<Func<Form, bool>>>.Is.Anything,
      Arg<string>.Is.Equal("FormTemplate, Event")))
    .Return(form);
\u mockRepo.Stub(
r=>
r、 GetOne(
Arg.Is.任何东西,
参数等于(“FormTemplate,Event”))
.报税表(表格);

如何存根Repo.GetOne方法,以便在使用参数调用该方法时设置返回值
f=>f.Id==formId,“FormTemplate,Event”

当设置存根/模拟时,调用
mockArg.Equals(runtimeArg)
时,用于参数的值必须返回true。您的
Func
不会这样做,因此最好使用
Arg.Matches()
约束,该约束接受一个函数,在给定存根输入的情况下,如果运行时输入是匹配的,则返回true

不幸的是,查看
Func
委托的内容并不简单。(看一看)

var myArgChecker=新函数(输入=>
{
//检查输入以确定是否匹配
返回true;//如果不想应用此存根,则返回false
});
_回购存根(
r=>
r、 GetOne(
Arg.Matches(输入=>myArgChecker(输入)),
参数等于(“FormTemplate,Event”))
.报税表(表格);

设置存根/模拟时,调用
mockArg.Equals(runtimeArg)
时,用于参数的值必须返回true。您的
Func
不会这样做,因此最好使用
Arg.Matches()
约束,该约束接受一个函数,在给定存根输入的情况下,如果运行时输入是匹配的,则返回true

不幸的是,查看
Func
委托的内容并不简单。(看一看)

var myArgChecker=新函数(输入=>
{
//检查输入以确定是否匹配
返回true;//如果不想应用此存根,则返回false
});
_回购存根(
r=>
r、 GetOne(
Arg.Matches(输入=>myArgChecker(输入)),
参数等于(“FormTemplate,Event”))
.报税表(表格);

谢谢,这真的很有帮助。我在这篇文章中将这种方法与表达式平等检查器相结合,最终找到了一个解决方案:谢谢,这真的很有帮助。在这篇文章中,我通过将此方法与表达式等式检查器相结合,得出了一个解决方案:
  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);