【发布时间】: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 方法,表达式 [] 参数) 在最小起订量.MethodCallReturn
2..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() 内部异常:
【问题讨论】: