相关疑难解决方法(0)

用Moq模拟扩展方法

我有一个预先存在的界面......

public interface ISomeInterface
{
    void SomeMethod();
}
Run Code Online (Sandbox Code Playgroud)

并且我使用mixin扩展了这个表面...

public static class SomeInterfaceExtensions
{
    public static void AnotherMethod(this ISomeInterface someInterface)
    {
        // Implementation here
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个叫这个我要测试的课程...

public class Caller
{
    private readonly ISomeInterface someInterface;

    public Caller(ISomeInterface someInterface)
    {
        this.someInterface = someInterface;
    }

    public void Main()
    {
        someInterface.AnotherMethod();
    }
}
Run Code Online (Sandbox Code Playgroud)

和测试,我想模拟界面并验证对扩展方法的调用...

    [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();
    }
Run Code Online (Sandbox Code Playgroud)

然而,运行此测试会产生异常......

System.ArgumentException: …
Run Code Online (Sandbox Code Playgroud)

c# extension-methods unit-testing moq mocking

153
推荐指数
6
解决办法
9万
查看次数

模拟静态方法

最近,我开始使用Moq进行单元测试.我使用Moq来模拟我不需要测试的类.

你通常如何处理静态方法?

public void foo(string filePath)
{
    File f = StaticClass.GetFile(filePath);
}
Run Code Online (Sandbox Code Playgroud)

怎么可能这个静态方法StaticClass.GetFile()被嘲笑?

PS我很欣赏你推荐的Moq和单元测试的任何阅读材料.

c# unit-testing moq mocking

66
推荐指数
4
解决办法
7万
查看次数

模拟IMemoryCache与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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这个错误?

这是测试中的代码:

var cachedResponse = _memoryCache.Get<String>(url);
Run Code Online (Sandbox Code Playgroud)

哪种_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);
Run Code Online (Sandbox Code Playgroud)

因为在memoryCache扩展中它显示它CreateEntry在内部使用Set.但是"对象引用没有设置为对象的实例"是错误的.

c# unit-testing moq .net-core asp.net-core

16
推荐指数
3
解决办法
6388
查看次数

如何使用Rhino Mock模拟扩展方法?

我有一些IDataReader类型的对象扩展我需要的扩展方法.问题是,当我尝试模拟IDataReader时,扩展方法不包含在模拟中,所以当行Expect.Call(reader.ExtensionMethod()).Return(someValue)到达时ExtensionMethod执行的不是我想要的!我希望该调用是记录,当扩展方法从其他地方调用时,我希望它返回someValue.

有谁知道怎么解决这个问题?

c# mstest rhino-mocks

9
推荐指数
2
解决办法
5176
查看次数

如何在C#AspNet Core中模拟LoggerFactory

我正在尝试为控制器操作编写一些单元测试.为此,我使用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);
Run Code Online (Sandbox Code Playgroud)

我假设问题是正在调用LogInformation,这是一个扩展方法,那么如何moq呢?

c# unit-testing moq

7
推荐指数
3
解决办法
4896
查看次数