Moq, SetupGet, Мокинг свойства

94

Я пытаюсь издеваться над классом с именем UserInputEntity, который содержит свойство с именем ColumnNames: (он содержит другие свойства, я просто упростил его для вопроса)

namespace CsvImporter.Entity
{
    public interface IUserInputEntity
    {
        List<String> ColumnNames { get; set; }
    }

    public class UserInputEntity : IUserInputEntity
    {
        public UserInputEntity(List<String> columnNameInputs)
        {
            ColumnNames = columnNameInputs;
        }

        public List<String> ColumnNames { get; set; }
    }
}

У меня есть класс ведущего:

namespace CsvImporter.UserInterface
{
    public interface IMainPresenterHelper
    {
        //...
    }

    public class MainPresenterHelper:IMainPresenterHelper
    {
        //....
    }

    public class MainPresenter
    {
        UserInputEntity inputs;

        IFileDialog _dialog;
        IMainForm _view;
        IMainPresenterHelper _helper;

        public MainPresenter(IMainForm view, IFileDialog dialog, IMainPresenterHelper helper)
        {
            _view = view;
            _dialog = dialog;
            _helper = helper;
            view.ComposeCollectionOfControls += ComposeCollectionOfControls;
            view.SelectCsvFilePath += SelectCsvFilePath;
            view.SelectErrorLogFilePath += SelectErrorLogFilePath;
            view.DataVerification += DataVerification;
        }


        public bool testMethod(IUserInputEntity input)
        {
            if (inputs.ColumnNames[0] == "testing")
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }
}

Я пробовал следующий тест, в котором я издеваюсь над сущностью, пытаюсь заставить ColumnNamesсвойство возвращать инициализированный, List<string>()но он не работает:

    [Test]
    public void TestMethod_ReturnsTrue()
    {
        Mock<IMainForm> view = new Mock<IMainForm>();
        Mock<IFileDialog> dialog = new Mock<IFileDialog>();
        Mock<IMainPresenterHelper> helper = new Mock<IMainPresenterHelper>();

        MainPresenter presenter = new MainPresenter(view.Object, dialog.Object, helper.Object);

        List<String> temp = new List<string>();
        temp.Add("testing");

        Mock<IUserInputEntity> input = new Mock<IUserInputEntity>();

    //Errors occur on the below line.
        input.SetupGet(x => x.ColumnNames).Returns(temp[0]);

        bool testing = presenter.testMethod(input.Object);
        Assert.AreEqual(testing, true);
    }

Ошибки, которые я получаю, указывают, что есть некоторые недопустимые аргументы + Аргумент 1 не может быть преобразован из строки в

System.Func<System.Collection.Generic.List<string>>

Любая помощь будет оценена.

Ганс Рудель
источник

Ответы:

192

ColumnNames- это свойство типа, List<String>поэтому при настройке вам необходимо передать a List<String>в Returnsвызове в качестве аргумента (или функцию, которая возвращает a List<String>)

Но этой строкой вы пытаетесь вернуть просто string

input.SetupGet(x => x.ColumnNames).Returns(temp[0]);

что вызывает исключение.

Измените его, чтобы вернуть весь список:

input.SetupGet(x => x.ColumnNames).Returns(temp);
Немесв
источник
3
Похоже, мне нужен перерыв. Большое спасибо за вашу помощь! (+1 n примет ваши ответы через 7 минут)
Hans Rudel
18
SetupGet () - это то, что я искал. Благодарность!
imnk 05
Как и я, использовал SetUpGet () для свойства класса, и он работает.
русский
4

Но при издевательстве над свойствами только для чтения подразумеваются свойства только с методом получения, вы должны объявить его как виртуальный, иначе будет выброшено исключение System.NotSupportedException, потому что оно поддерживается только в VB как внутреннее переопределение moq и создание прокси, когда мы что-то имитируем.

Химаншу Сони
источник
1
Итак, как объявить свойство, доступное только для чтения, как виртуальное в интерфейсе?
erict