developer tip

Moq, SetupGet, Mocking a property

optionbox 2020. 10. 21. 07:57
반응형

Moq, SetupGet, Mocking a property


나는라는 UserInputEntity속성을 포함 하는 클래스를 모의하려고합니다 ColumnNames: (다른 속성을 포함하고 있습니다. 질문에 대해 단순화했습니다)

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

발표자 클래스가 있습니다.

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

엔터티를 조롱하고 ColumnNames속성을 가져 와서 초기화 된 값을 반환 하려고 시도 List<string>()했지만 작동하지 않는 다음 테스트를 시도 했습니다.

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

잘못된 인수가 있음을 나타내는 오류 + 인수 1을 문자열에서 다음으로 변환 할 수 없습니다.

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

어떤 도움을 주시면 감사하겠습니다.


ColumnNames은 유형의 속성 List<String>이므로 설정할 때 호출 List<String>에서 a Returns인수로 전달해야합니다 (또는 a를 반환하는 func List<String>).

하지만이 줄을 사용하면 string

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

예외가 발생합니다.

전체 목록을 반환하도록 변경하십시오.

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

But while mocking read-only properties means properties with getter method only you should declare it as virtual otherwise System.NotSupportedException will be thrown because it is only supported in VB as moq internally override and create proxy when we mock anything.

참고URL : https://stackoverflow.com/questions/12141799/moq-setupget-mocking-a-property

반응형