153 votes

Moq, SetupGet, Mocking d'une propriété

J'essaie de simuler une classe, appelée UserInputEntity qui contient une propriété appelée ColumnNames (il contient d'autres propriétés, je l'ai juste simplifié pour la question).

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

J'ai une classe de présentateurs :

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

J'ai essayé le test suivant, où je me moque de l'entité, en essayant d'obtenir ColumnNames pour renvoyer une List<string>() mais ça ne marche pas :

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

Les erreurs que je reçois indiquent qu'il y a des arguments non valides + L'argument 1 ne peut pas être converti de chaîne en

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

Toute aide serait appréciée.

290voto

nemesv Points 71516

ColumnNames est une propriété de type List<String> donc lorsque vous configurez, vous devez passer un fichier List<String> dans le Returns en tant qu'argument (ou un func qui renvoie un List<String> )

Mais avec cette ligne, vous essayez de retourner juste un string

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

qui cause l'exception.

Changez-le pour retourner la liste entière :

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

13voto

Himanshu Soni Points 76

Le moquage des propriétés en lecture seule signifie des propriétés avec une méthode getter uniquement.

Note que vous devez le déclarer comme virtual sinon System.NotSupportedException seront lancés.

Si vous utilisez une interface, cela ne s'applique pas à vous. Cela fonctionne instantanément parce que le framework mock implémentera l'interface à la volée pour vous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X