我需要模拟一个在构造函数中具有参数的类,因为我无法弄清楚如何使用moq进行操作。崩溃
构造函数参数不能传递给接口模拟。
在下面查看我的尝试
[Fact]
public async Task MyTest()
{
var mySettings= GetMySettings();
var mySettingsOptions = Options.Create(mySettings);
var mockLogger = Mock.Of<ILogger<MyClass>>();
var mock=new Mock<IMyClass>(mySettings,mockLogger);
mock.Setup(x=>x.DoSomething(It.IsAny<string>().Returns("todo");
}
public class MyClass : IMyClass
{
private readonly ILogger<MyClass> logger;
private readonly MySettings mySettings;
public MyClass(IOptions<MySettings> settings,ILogger<MyClass>logger)
{
this.logger = logger;
this.mySettings = settings.Value;
}
public string DoSomething(string myarg)
{
//omitted
}
}
您如何做?非常感谢
已编辑
为了模拟存储库并测试行为,我还需要模拟其他具有构造函数的类。希望是有道理的
public class MyService:IMyService
{
private MyClass myclass;
private OtherClass otherClass;
private Repository repository;
public MyService(IRepository repository,IMyClass myclass,IMyOtherClass otherClass)
{
this.myclass=myClass;
this.otherClass=otherClass;
this.repository=repository;
}
public void DoStuff()
{
bool valid1=myclass.Validate(); //mock myclass
var valid2=otherClass.Validate(); //mock otherClass
if(Valid1 && valid2)
{
repository.GetSomething();//this is really what I am mocking
}
//etc..
}
}
答案 0 :(得分:1)
您的类构造函数是否具有参数都没有关系,因为您正在使用其模拟对象。
var mock = new Mock<IMyClass>();
mock.Setup(x=>x.DoSomething(It.IsAny<string>()).Returns("todo");
然后,您可以将此模拟用于您的存储库构造函数:
var myService = new MyService(repositoryMock.Object, mock.Object, otherClassMock.Object);
答案 1 :(得分:0)
您收到此错误,是因为您尝试使用构造函数值创建接口的模拟(在这种情况下为IMyClass
)。似乎您正在尝试测试类MyClass
中的方法,因此您应该创建此类的最小起订量。
澄清变化
var mock=new Mock<IMyClass>(mySettings,mockLogger);
至var mock=new Mock<MyClass>(mySettings,mockLogger);