Mocking of extension method result in System.NotSupportedException

本秂侑毒 提交于 2019-12-06 13:41:45

问题


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

ClientService.cs:

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

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

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());

It throw an exception of:

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

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);
}

回答1:


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...

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>);


来源:https://stackoverflow.com/questions/57705394/mocking-of-extension-method-result-in-system-notsupportedexception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!