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.

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

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.


1
Jadi bagaimana cara mendeklarasikan properti read-only sebagai virtual dalam sebuah antarmuka?
erik
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.