模拟扩展方法导致 System.NotSupportedException [英] Mocking of extension method result in System.NotSupportedException

查看:26
本文介绍了模拟扩展方法导致 System.NotSupportedException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在对使用 IMemoryCache 接口的 ClientService 进行单元测试:

I'm unit testing a ClientService that uses the IMemoryCache interface:

ClientService.cs:

ClientService.cs:

public string Foo()
{        
    //... code

    _memoryCache.Set("MyKey", "SomeValue", new TimeSpan(0, 0, 60));
}

当我尝试模拟 IMemoryCacheSet 扩展时:

When I try to mock the IMemoryCache's Set extension with:

AutoMock mock = AutoMock.GetLoose();

var memoryCacheMock = _mock.Mock<IMemoryCache>();

string value = string.Empty;

// Attempt #1:
memoryCacheMock
     .Setup(x => x.Set<string>(It.IsAny<object>(), It.IsAny<string>(), It.IsAny<TimeSpan>()))
     .Returns("");

// Attempt #2:
memoryCacheMock
    .Setup(x => x.Set(It.IsAny<object>(), It.IsAny<object>(), It.IsAny<TimeSpan>()))
    .Returns(new object());

它抛出一个异常:

System.NotSupportedException:不支持的表达式:x =>x.Set(It.IsAny(), It.IsAny(),It.IsAny())扩展方法(此处:CacheExtensions.Set)不能在设置/验证前使用

System.NotSupportedException: Unsupported expression: x => x.Set(It.IsAny(), It.IsAny(), It.IsAny()) Extension methods (here: CacheExtensions.Set) may not be used in setup / verification ex

这是命名空间的缓存扩展Microsoft.Extensions.Caching.Memory

This is the Cache extension of the namespace Microsoft.Extensions.Caching.Memory

public static class CacheExtensions
{
   public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, TimeSpan absoluteExpirationRelativeToNow);
}

推荐答案

扩展方法实际上是静态方法,不能使用 moq 模拟它们.您可以模拟的是扩展方法本身使用的方法...

Extension methods are actually static methods and they cannot be mocked using moq. What you could mock are the methods used by the extension method itself...

在您的情况下 Set 使用 CreateEntry 这是由 IMemoryCache 定义的方法,它可以被模拟.尝试这样的事情:

In your case Set uses CreateEntry which is the method defined by IMemoryCache and it could be mocked. Try something like this:

memoryCacheMock
    .Setup(x => x.CreateEntry(It.IsAny<object>()))
    .Returns(Mock.Of<ICacheEntry>);

这篇关于模拟扩展方法导致 System.NotSupportedException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆