web-dev-qa-db-fra.com

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

J'essaie de me moquer d'une classe, appelée UserInputEntity, qui contient une propriété appelée ColumnNames: (elle contient d'autres propriétés, je viens de la simplifier 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 un cours d'animateur:

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é, essaie d'obtenir la propriété ColumnNames pour renvoyer une List<string>() initialisée, mais cela ne fonctionne 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 existe 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.

70
Hans Rudel

ColumnNames est une propriété de type List<String> donc vous devez passer un List<String> dans l’appel Returns en tant qu’argument (ou fonction qui retourne 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 complète:

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

Cependant, bien que mapper des propriétés en lecture seule signifie des propriétés avec la méthode getter uniquement, vous devez le déclarer comme virtuel. Sinon, une exception System.NotSupportedException sera levée car elle est uniquement prise en charge dans VB en tant que moq remplace en interne et crée un proxy lorsque on se moque de tout.

4
Himanshu Soni