Moq, SetupGet, Mocking một thuộc tính


94

Tôi đang cố gắng bắt chước một lớp, được gọi UserInputEntity, chứa một thuộc tính được gọi là ColumnNames: (nó có chứa các thuộc tính khác, tôi vừa đơn giản hóa nó cho câu hỏi)

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

Tôi có một lớp người thuyết trình:

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

Tôi đã thử kiểm tra sau đây, trong đó tôi mô phỏng thực thể, cố gắng lấy thuộc ColumnNamestính để trả về giá trị khởi tạo List<string>()nhưng nó không hoạt động:

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

Các lỗi tôi nhận được cho biết rằng có một số đối số không hợp lệ + Đối số 1 không thể chuyển đổi từ chuỗi thành

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

Bất kỳ trợ giúp sẽ được đánh giá cao.

Câu trả lời:


192

ColumnNameslà một thuộc tính của kiểu, List<String>vì vậy khi bạn đang thiết lập, bạn cần phải chuyển một List<String>trong Returnscuộc gọi dưới dạng một đối số (hoặc một hàm trả về a List<String>)

Nhưng với dòng này, bạn đang cố gắng trả về string

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

mà gây ra ngoại lệ.

Thay đổi nó để trả về toàn bộ danh sách:

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

3
Có vẻ như tôi cần nghỉ ngơi. Cảm ơn rất nhiều về sự giúp đỡ của bạn! (+1 n sẽ chấp nhận ans ur trong 7mins)
Hans Rudel

18
SetupGet () là những gì tôi đang tìm kiếm. Cảm ơn!
imnk

Giống như tôi, đã sử dụng SetUpGet () cho thuộc tính lớp và nó hoạt động.
Nga

4

Nhưng trong khi chế nhạo các thuộc tính chỉ đọc có nghĩa là các thuộc tính chỉ có phương thức getter, bạn nên khai báo nó là ảo nếu không thì System.NotSupportedException sẽ bị ném ra vì nó chỉ được hỗ trợ trong VB dưới dạng ghi đè nội bộ moq và tạo proxy khi chúng ta chế tạo bất cứ thứ gì.


1
Vậy làm thế nào để khai báo một thuộc tính chỉ đọc là ảo trong một giao diện?
erict
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.