developer9969
developer9969

Reputation: 5236

Moq class with constructors ILogger and options netcore 2.1 vs2017 getting error

I need to mock a class that has parameters in the constructor by I cannot figure out how you do it using moq. It crashes

Constructor arguments cannot be passed for interface mocks.

See my attempt below:

   [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
        }

    }

How do you do it? many thanks

EDITED

In order to mock repository and test the behaviour i also need to mock the other classes that have constructors in it. Hope makes sense

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..

    }
}

Upvotes: 0

Views: 55

Answers (2)

Alex Riabov
Alex Riabov

Reputation: 9185

It doesn't matter if your class constructor has parameters or not, because you're working with its mock object.

var mock = new Mock<IMyClass>();
mock.Setup(x=>x.DoSomething(It.IsAny<string>()).Returns("todo");

Then you can use this mock to your repository constructor:

var myService = new MyService(repositoryMock.Object, mock.Object, otherClassMock.Object);

Upvotes: 1

Jordan Bowker
Jordan Bowker

Reputation: 276

You are getting this error because you are trying to create a mock of an interface (IMyClass in this case) with constructor values. It seems like you are trying to test the method in the class MyClass, therefore you should be creating a moq of this class. To clarify change var mock=new Mock<IMyClass>(mySettings,mockLogger); to var mock=new Mock<MyClass>(mySettings,mockLogger);

Upvotes: 0

Related Questions