Moq, SetupGet, Mocking properti

94

Saya mencoba untuk mengejek kelas, yang disebut UserInputEntity, yang berisi properti yang disebut ColumnNames: (itu memang berisi properti lain, saya baru saja menyederhanakannya untuk pertanyaan itu)

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

Saya memiliki kelas presenter:

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

Saya telah mencoba tes berikut, di mana saya mengejek entitas, mencoba mendapatkan ColumnNamesproperti untuk mengembalikan yang diinisialisasi List<string>()tetapi tidak berfungsi:

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

Kesalahan yang saya dapatkan menyatakan bahwa ada beberapa argumen yang tidak valid + Argumen 1 tidak dapat diubah dari string menjadi

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

Bantuan apa pun akan dihargai.

Hans Rudel
sumber

Jawaban:

192

ColumnNamesadalah properti jenis List<String>sehingga ketika Anda sedang mengatur Anda harus lulus List<String>dalam Returnspanggilan sebagai argumen (atau func suatu yang mengembalikan List<String>)

Tetapi dengan baris ini Anda mencoba mengembalikan hanya a string

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

yang menyebabkan pengecualian.

Ubah untuk mengembalikan seluruh daftar:

input.SetupGet(x => x.ColumnNames).Returns(temp);
nemesv
sumber
3
Sepertinya saya butuh istirahat. Terima kasih banyak atas bantuan Anda! (+1 n akan menerima Anda dalam 7 menit)
Hans Rudel
18
SetupGet () adalah yang saya cari. Terima kasih!
imnk
Sama seperti saya, menggunakan SetUpGet () untuk properti kelas dan berhasil.
hussian
4

Tetapi sementara mocking properti read-only berarti properti dengan metode getter saja Anda harus mendeklarasikannya sebagai virtual, jika tidak System.NotSupportedException akan dilempar karena hanya didukung di VB karena moq menimpa secara internal dan membuat proxy ketika kita memalsukan apa pun.

Himanshu Soni
sumber
1
Jadi bagaimana cara mendeklarasikan properti read-only sebagai virtual dalam sebuah antarmuka?
erik