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>тому при налаштуванні вам необхідно передати List<String>в Returnsвиклику в якості аргументу (або FUNC , які повертають List<String>)

Але за допомогою цього рядка ви намагаєтесь повернути лише a string

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

що викликає виняток.

Змініть його, щоб повернути весь список:

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

3
Схоже, мені потрібна перерва. Велике спасибі за вашу допомогу! (+1 п прийме ур через 7 хвилин)
Ганс Рудель,

18
SetupGet () - це те, що я шукав. Дякую!
imnk

Так само, як і я, використовував SetUpGet () для властивості класу, і він працює.
гусіян

4

Але хоча знущання над властивостями лише для читання означає властивості лише за допомогою методу getter, ви повинні оголосити це як віртуальне, інакше буде викинуто System.NotSupportedException, оскільки воно підтримується лише у VB, оскільки moq внутрішньо перевизначає і створює проксі, коли ми знущаємося над чим-небудь.


1
Тож як оголосити властивість лише для читання як віртуальну в інтерфейсі?
обмежити
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.