gpt4 book ai didi

c# - 模拟扩展方法导致 System.NotSupportedException

转载 作者:行者123 更新时间:2023-12-03 15:21:37 25 4
gpt4 key购买 nike

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

客户端服务.cs:

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

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

当我尝试模拟 IMemoryCacheSet扩展名:
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: 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
public static class CacheExtensions
{
public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, TimeSpan absoluteExpirationRelativeToNow);
}

最佳答案

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

在你的情况下Set使用 CreateEntry这是IMemoryCache定义的方法它可以被 mock 。尝试这样的事情:

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

关于c# - 模拟扩展方法导致 System.NotSupportedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57705394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com