我有一个预先存在的界面......
public interface ISomeInterface
{
    void SomeMethod();
}
并且我使用mixin扩展了这个表面...
public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // Implementation here
    }
}
我有一个叫这个我要测试的课程...
public class Caller
{
    private readonly ISomeInterface someInterface;
    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }
    public void Main()
    {
        someInterface.AnotherMethod();
    }
}
和测试,我想模拟界面并验证对扩展方法的调用...
    [Test]
    public void Main_BasicCall_CallsAnotherMethod()
    {
        // Arrange
        var someInterfaceMock = new Mock<ISomeInterface>();
        someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable();
        var caller = new Caller(someInterfaceMock.Object);
        // Act
        caller.Main();
        // Assert
        someInterfaceMock.Verify();
    }
然而,运行此测试会产生异常......
System.ArgumentException: …最近,我开始使用Moq进行单元测试.我使用Moq来模拟我不需要测试的类.
你通常如何处理静态方法?
public void foo(string filePath)
{
    File f = StaticClass.GetFile(filePath);
}
怎么可能这个静态方法StaticClass.GetFile()被嘲笑?
PS我很欣赏你推荐的Moq和单元测试的任何阅读材料.
我正试图IMemoryCache用Moq 嘲笑.我收到这个错误:
Moq.dll中出现"System.NotSupportedException"类型的异常,但未在用户代码中处理
附加信息:表达式引用不属于模拟对象的方法:x => x.Get <String>(It.IsAny <String>())
我的嘲弄代码:
namespace Iag.Services.SupplierApiTests.Mocks
{
    public static class MockMemoryCacheService
    {
        public static IMemoryCache GetMemoryCache()
        {
            Mock<IMemoryCache> mockMemoryCache = new Mock<IMemoryCache>();
            mockMemoryCache.Setup(x => x.Get<string>(It.IsAny<string>())).Returns("");<---------- **ERROR**
            return mockMemoryCache.Object;
        }
    }
}
为什么我会收到这个错误?
这是测试中的代码:
var cachedResponse = _memoryCache.Get<String>(url);
哪种_memoryCache类型IMemoryCache
我如何模拟_memoryCache.Get<String>(url)上面的内容并让它返回null?
编辑:我怎么做同样的事情,但为   _memoryCache.Set<String>(url, response);?我不介意它返回什么,我只需要将方法添加到mock中,这样它就不会在调用时抛出.
我试着回答这个问题的答案:
mockMemoryCache
    .Setup(m => m.CreateEntry(It.IsAny<object>())).Returns(null as ICacheEntry);
因为在memoryCache扩展中它显示它CreateEntry在内部使用Set.但是"对象引用没有设置为对象的实例"是错误的.
我有一些IDataReader类型的对象扩展我需要的扩展方法.问题是,当我尝试模拟IDataReader时,扩展方法不包含在模拟中,所以当行Expect.Call(reader.ExtensionMethod()).Return(someValue)到达时ExtensionMethod执行的不是我想要的!我希望该调用是记录,当扩展方法从其他地方调用时,我希望它返回someValue.
有谁知道怎么解决这个问题?
我正在尝试为控制器操作编写一些单元测试.为此,我使用XUnit和Moq.控制器在构造函数中注入ILoggerFactory.一个Moq如何进行测试?
我已经尝试为控制器类模拟一个Logger,然后模拟CreateLogger以返回模拟Logger,但是当调用LogInformation()函数时,我不断获得各种测试运行时NullReferenceExceptions.
        //   Logger that yields only disappointment...          
        var mockLogger = new Mock<ILogger<JwtController>>();
        mockLogger.Setup(ml => ml.Log(It.IsAny<LogLevel>(), It.IsAny<EventId>(), It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()));
        var mockLoggerFactory = new Mock<ILoggerFactory>();
        mockLoggerFactory.Setup(mlf => mlf.CreateLogger("JwtController")).Returns(mockLogger.Object);
我假设问题是正在调用LogInformation,这是一个扩展方法,那么如何moq呢?