Moq类与构造函数ILogger和选项Netcore 2.1 vs2017出现错误

时间:2018-07-01 08:28:51

标签: asp.net-core moq

我需要模拟一个在构造函数中具有参数的类,因为我无法弄清楚如何使用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..

    }
}

2 个答案:

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