【问题标题】:Microsoft Fakes shim for generic method用于通用方法的 Microsoft Fakes shim
【发布时间】:2014-01-16 06:27:23
【问题描述】:

我不知道如何为特定的通用方法设置垫片。这是实际方法的签名:

public IEnumerable<TElement> ExecuteQuery<TElement>(TableQuery<TElement> query, TableRequestOptions requestOptions = null, OperationContext operationContext = null) where TElement : ITableEntity, new();

这是我目前尝试(但失败)配置垫片的方式:

ShimCloudTable shimTable = new ShimCloudTable();
shimTable.ExecuteQueryOf1TableQueryOfM0TableRequestOptionsOperationContext<MyEntity> = (query, options, context) => {
    return new List<MyEntity>();
};

编译器只是给了我几个“无效的表达式术语”错误,所以很明显我在这里遗漏了一些非常基本的东西。

编辑:这是由 MS Fakes 生成的 shim 签名:

public void ExecuteQueryOf1TableQueryOfM0TableRequestOptionsOperationContext<TElement>(FakesDelegates.Func<TableQuery<TElement>, TableRequestOptions, Microsoft.WindowsAzure.Storage.OperationContext, System.Collections.Generic.IEnumerable<TElement>> shim) where TElement : ITableEntity, new();

【问题讨论】:

  • 你让我感到困惑...ExecuteQueryOf1TableQueryOfM0TableRequestOptionsOperationContext 看起来不对...尤其是您的示例方法是ExecuteQuery
  • 这对我来说看起来超级脆弱……
  • 是的,这就是 Fakes 的魔力。并不总是漂亮,但它可以完成工作。 msdn.microsoft.com/en-us/library/hh708916.aspx
  • @elgonzo 试试 obj-c :P

标签: c# generics microsoft-fakes


【解决方案1】:

我找不到任何涵盖此的官方文档,但问题毕竟很简单。我习惯于将 Fakes 用于简单方法,您只需将 Func 分配给您感兴趣的填充方法委托,如下所示:

shimAccount.CreateCloudTableClient = () => { return shimTableClient; };

但是,当涉及到泛型时,Fakes 会创建一个将 Func 作为参数的方法,而不是直接公开委托。所以我需要的是:

shimTable.ExecuteQueryOf1TableQueryOfM0TableRequestOptionsOperationContext<MyEntity>((query, options, context) =>
{
    return new List<MyEntity>();
});

【讨论】:

  • 非常感谢您的回答!我有一个具有以下签名的通用扩展方法: public static IQueryable IncludeMultiple(this IQueryable query, params Expression>[] includes) where T : class 为年龄,但在我看到你的答案后,我用以下内容覆盖了它: ShimQueryableExt.IncludeMultipleOf1IQueryableOfM0ExpressionOfFuncOfM0ObjectArray((query, includes) => { return query; });干杯!
猜你喜欢
  • 1970-01-01
  • 2013-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多