Класс Moq с конструкторами ILogger и опциями netcore 2.1 vs2017 получаю ошибку - PullRequest
0 голосов
/ 01 июля 2018

Мне нужно смоделировать класс, который имеет параметры в конструкторе. Я не могу понять, как вы это делаете, используя 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
        }

    }

Как ты это делаешь? большое спасибо

EDITED

Чтобы смоделировать хранилище и проверить поведение, мне также нужно смоделировать другие классы, в которых есть конструкторы. Надежда имеет смысл

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 голосов
/ 01 июля 2018

Неважно, имеет ли ваш конструктор класса параметры или нет, потому что вы работаете с его фиктивным объектом.

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);
0 голосов
/ 01 июля 2018

Вы получаете эту ошибку, потому что вы пытаетесь создать макет интерфейса (IMyClass в этом случае) со значениями конструктора. Похоже, вы пытаетесь протестировать метод в классе MyClass, поэтому вы должны создать moq этого класса. Чтобы уточнить изменения var mock=new Mock<IMyClass>(mySettings,mockLogger); до var mock=new Mock<MyClass>(mySettings,mockLogger);

...