Moq, SetupGet, Verspotten einer Eigenschaft


88

Ich versuche, eine Klasse namens "verspottet" zu verspotten UserInputEntity, die eine Eigenschaft namens "enthält" ColumnNames(sie enthält andere Eigenschaften, ich habe sie nur für die Frage vereinfacht).

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

Ich habe eine Präsentationsklasse:

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

Ich habe den folgenden Test versucht, bei dem ich die Entität verspotte und versuche, die ColumnNamesEigenschaft dazu zu bringen , eine initialisierte zurückzugeben, List<string>()aber sie funktioniert nicht:

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

Die Fehler, die ich erhalte, besagen, dass es einige ungültige Argumente gibt + Argument 1 kann nicht von Zeichenfolge in konvertiert werden

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

Jede Hilfe wäre dankbar.

Antworten:


182

ColumnNamesist eine Eigenschaft vom Typ. List<String>Wenn Sie also einrichten, müssen Sie ein List<String>im ReturnsAufruf als Argument übergeben (oder eine Funktion, die a zurückgibt List<String>).

Aber mit dieser Zeile versuchen Sie, nur a zurückzugeben string

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

was die Ausnahme verursacht.

Ändern Sie es, um die gesamte Liste zurückzugeben:

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

2
Sieht so aus, als ob ich eine Pause brauche. Vielen Dank für Ihre Hilfe! (+1 n akzeptiert ur ans in 7 Minuten)
Hans Rudel

15
SetupGet () war das, wonach ich gesucht habe. Vielen Dank!
Imnk

Wie ich, habe SetUpGet () für die Klasseneigenschaft verwendet und es funktioniert.
Hussian

4

Während das Verspotten von schreibgeschützten Eigenschaften nur Eigenschaften mit der Getter-Methode bedeutet, sollten Sie sie als virtuell deklarieren, andernfalls wird System.NotSupportedException ausgelöst, da sie in VB nur unterstützt wird, wenn moq intern überschreibt und einen Proxy erstellt, wenn wir etwas verspotten.


1
Wie deklariert man eine schreibgeschützte Eigenschaft in einer Schnittstelle als virtuell?
Erict
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.