使用 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);