【问题标题】:MOQ Task Callback Returns Unsupported Expression ContextMOQ 任务回调返回不支持的表达式上下文
【发布时间】:2016-06-08 20:42:49
【问题描述】:

我已经为此争论了好几个小时,甚至还请了另外两个同事,我们终于得到了编译器满意的语法,但现在看来 MOQ 不满意?!

代码来自一个非常大的项目,所以我只提供第一级抽象,否则这很可能是 SO 见过的最长的帖子。

我将从我的单元测试开始:

[TestMethod]
public async Task GetPlan_BadPlanID()
{
   ...snip...

   //Create DataAccessTemplate at this point doesn't need anything special
   Mock<IDataAccessTemplate> dataAccessTemplate = new Mock<IDataAccessTemplate>();

   //This is the line that throws the exception   
   dataAccessTemplate
      .Setup(template => template.InvokeAsync<DefaultActionPlan>(context => Task.FromResult(new DefaultActionPlan())))
      .Returns(Task.FromResult(new DefaultActionPlan()));

     ...snip rest of test....
}

现在,如果需要,我将展示所有被嘲笑的东西,但为简洁起见,我将只展示有问题的方法。

public class PlanDataProvider : BaseDomainServiceProvider, IPlanDataProvider
{
    protected IDataAccessTemplate Template { get; set; }


   public async Task<DefaultActionPlan> GetDefaultActionPlan(string referenceListId)
   {
      var objectId = GetObjectId(referenceListId);

      var defaultActionPlan = await Template.InvokeAsync(context => Task.FromResult(EntityStore.GetEntityById<DefaultActionPlan, ObjectId>
      (
         context.ActivityContext as IDataAccessContext,
         typeof(DefaultActionPlan).FullName,
         objectId
       )));

      return RemoveAclData(defaultActionPlan);
   }
}

IDataAccess:

public interface IDataAccessTemplate : IServiceTemplate
{ //empty for now    }

IServiceTemplate:

public interface IServiceTemplate
{
   Task<TReply> InvokeAsync<TReply>(Func<ITemplateContext, Task<TReply>> invokeCallback);

   Task<TReply> InvokeAsync<TReply>(Func<ITemplateContext, Task<TReply>> invokeCallback, Action<ITemplateContext, Exception> errorCallback);
}

错误:

System.NotSupportedException 被捕获 HResult=-2146233067 消息=不支持的表达式:上下文 => FromResult(new DefaultActionPlan()) 来源=起订量

堆栈跟踪: 在 Moq.MatcherFactory.CreateMatcher(表达式表达式,布尔 isParams) 在 Moq.MethodCall..ctor(模拟模拟,条件条件,表达式 originalExpression,MethodInfo 方法,表达式 [] 参数) 在 Moq.MethodCallReturn..ctor(模拟模拟,条件条件,表达式 originalExpression,MethodInfo 方法,表达式 [] 参数) 在最小起订量.MethodCallReturn2..ctor(Mock mock, Condition condition, Expression originalExpression, MethodInfo method, Expression[] arguments) at Moq.Mock.<>c__DisplayClass1c2.b__1b() 在 Moq.PexProtector.Invoke[T](Func1 function) at Moq.Mock.Setup[T,TResult](Mock1 mock, Expression1 expression, Condition condition) at Moq.Mock1.Setup[TResult](Expression`1 表达式) 在 c:\Source...\Dev\DataService.Tests\Controllers\Plan\PlanProviderTest.cs:line 52 中的 DataService.Tests.Controllers.ActionPlan.PlanProviderTest.d__3.MoveNext() 内部异常:

【问题讨论】:

    标签: c# moq


    【解决方案1】:

    不确定这是否会改变任何事情,但不要这样做:

    context => Task.FromResult(new DefaultActionPlan())
    

    试试这个:

    context => Task.FromResult(It.IsAny<DefaultActionPlan>())
    

    并可能将您的回报更改为:

    .ReturnsAsync(new DefaultActionPlan());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 2015-12-14
      相关资源
      最近更新 更多