Moq, SetupGet, burlarse de una propiedad

94

Estoy tratando de simular una clase, llamada UserInputEntity, que contiene una propiedad llamada ColumnNames: (contiene otras propiedades, acabo de simplificarla para la pregunta)

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

Tengo una clase de presentador:

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

Probé la siguiente prueba, donde me burlo de la entidad, trato de obtener la ColumnNamespropiedad para devolver un inicializado List<string>()pero no funciona:

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

Los errores que obtengo indican que hay algunos argumentos no válidos + El argumento 1 no se puede convertir de cadena a

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

Cualquier ayuda sería apreciada.

Hans Rudel
fuente

Respuestas:

192

ColumnNameses una propiedad de tipo, List<String>por lo que cuando está configurando, debe pasar a List<String>en la Returnsllamada como un argumento (o una función que devuelve a List<String>)

Pero con esta línea está intentando devolver sólo un string

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

que está causando la excepción.

Cámbielo para devolver la lista completa:

input.SetupGet(x => x.ColumnNames).Returns(temp);
nemesv
fuente
3
Parece que necesito un descanso. ¡Muchas gracias por su ayuda! (+1 n aceptará ur ans en 7 minutos)
Hans Rudel
18
SetupGet () era lo que estaba buscando. ¡Gracias!
Imnk
Igual que yo, usé SetUpGet () para la propiedad de la clase y funciona.
hussian
4

Pero mientras que las propiedades de solo lectura simuladas significan propiedades con el método getter, solo debe declararlo como virtual; de lo contrario, se lanzará System.NotSupportedException porque solo es compatible con VB, ya que moq anula internamente y crea un proxy cuando nos burlamos de algo.

Himanshu Soni
fuente
1
Entonces, ¿cómo se declara una propiedad de solo lectura como virtual en una interfaz?
Eric