我正在尝试使用 MSTest 和 Moq 为使用 IMemoryCache 扩展方法的方法编写单元测试。 情况:

public class ClassToTest
{        
  private IMemoryCache Cache { get; }

  public ClassToTest(IMemoryCache cache)
  {          
    Cache = cache;
  }

  public async Task<SomeType> MethodToTest(string key)
  {
    // Get is an extension method defined in Microsoft.Extensions.Caching.Memory
    var ci = Cache.Get<CachedItem<T>>(key);

    // Do stuff with cached item
  }
}

我如何进行单元测试?

到目前为止,我尝试过:

[TestMethod]
public void TestMethodToTest()
{
  IServiceCollection services = new ServiceCollection();
  services.AddMemoryCache();

  var serviceProvider = services.BuildServiceProvider();
  var memoryCache = serviceProvider.GetService<IMemoryCache>();

  ClassToTest testClass = new ClassToTest(memoryCache);
}

这给了我以下错误:“‘IServiceCollection’不包含‘AddMemoryCache’的定义,并且找不到接受‘IServiceCollection’类型的第一个参数的可访问扩展方法‘AddMemoryCache’(您是否缺少 using 指令或程序集)参考?)”。

有谁知道如何对这种方法进行单元测试? 最好不要改变方法本身。 有没有标准的方法来做到这一点? 任何帮助是appriciated。

#1楼 票数:1 已采纳

我认为你必须修改ClassToTest 您可以拥有一个Func<string, CachedItem<T>>类型的属性,该属性被分配为在类的构造函数中使用扩展:

public Func<string, CachedItem<T>> GetFromCache { get; set; }
public ClassToTest(IMemoryCache cache)
{          
    Cache = cache;
    GetFromCache = key => Cache.Get<CachedItem<T>>(key);
}

然后,当你想测试那个类时,你可以通过说:

ClassToTest testClass = new ClassToTest(memoryCache);
testClass.GetFromCache = key => /* something else */;

一般来说,扩展方法仍然只是静态方法之上的语法糖,因此像ClassToTest那样使用它们会引入依赖关系并使代码更难ClassToTest测试。

  ask by Martijn translate from so

未解决问题?本站智能推荐:

2回复

使用moq的扩展方法的单元测试

我有两种扩展方法,如下所示, 我听说单元测试扩展方法是不可能的,因为它们是静态的。 只是想检查是否有人有想法使用Moq对上述扩展方法进行单元测试? 有人可以指点我正确的方向吗?
1回复

传入对象时,xUnitMoq设置无法检测到该方法

我对单元测试和最小起订量很陌生。 在我的 .net core 3.1 项目 I' 中,使用 xUnit 和 Moq 编写单元测试。 我有以下场景,我无法弄清楚为什么最小起订量无法检测到我的功能。 我已将我的单元测试配置如下, 在我的测试功能中,我尝试使用上述设置来调整两个功能, 我的模特有吹课, 当
3回复

单元测试SqlCommand扩展方法的方法

我为SqlCommand创建了一个扩展方法,在执行命令之前允许一些额外的工作: 我的问题是,对这种扩展方法进行单元测试的最佳方法是什么? 我应该直接针对数据库进行测试吗? 或者我应该尝试创建一个模拟对象? 如果是这种情况我尝试通过Moq这样做,但由于SqlCommand是一个密封的
5回复

在单元测试中模拟IMemoryCache

我正在使用 asp net core 1.0 和 xunit。 我正在尝试为一些使用IMemoryCache代码编写单元测试。 但是,每当我尝试在IMemoryCache设置一个值时,我都会收到 Null 引用错误。 我的单元测试代码是这样的: IMemoryCache被注入到我要测试的类中。 但
1回复

使用moq对扩展方法进行单元测试

我正在为 azuresearch 的函数 uploaddocuments() 编写单元测试。 不知道为什么它不起作用。 代码: 测试:
2回复

c#单元测试方法,调用EFCore扩展方法

我一直试图对这个简单的方法进行单元测试: 但是,从调用ForEachAsync()方法的那一刻起,我就很难对该方法进行单元测试。 到目前为止,我已经使用Moq来设置dbContext,以便Where()执行Where()时返回正确的设置。 我的尝试: 我的问题是:我如何对ForEa
3回复

单元测试使用外部dll的方法

我有一个名为A的项目,它有一个名为ClassA的类。 ClassA有一个名为ReadBlock()的方法,它创建一个CloudBlockBlob对象并调用其中一个方法。 CloudBlockBlob是一个位于Microsoft.WindowsAzure.Szrage.Blob命名空间的类,
1回复

单元测试使用Moq的(动态)方法

我有以下方法: QueueStorage是实现IQueueStorage的依赖项。 我希望对它进行单元测试但是(动态)关键字似乎阻止了Moq正确绑定它。 将关键字添加到队列时,该关键字用于正确分配具体的类类型而不是ICommand接口类型。 单元测试如下所示: 虽然test命令是