我有一个预先存在的界面......
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) 最近,我开始使用Moq进行单元测试.我使用Moq来模拟我不需要测试的类.
你通常如何处理静态方法?
public void foo(string filePath)
{
File f = StaticClass.GetFile(filePath);
}
Run Code Online (Sandbox Code Playgroud)
怎么可能这个静态方法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;
}
}
}
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.但是"对象引用没有设置为对象的实例"是错误的.
我有一些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);
Run Code Online (Sandbox Code Playgroud)
我假设问题是正在调用LogInformation,这是一个扩展方法,那么如何moq呢?