Moq, SetupGet, Mocking a property


94

나는라는 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>>

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

답변:


192

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

3
휴식이 필요한 것 같습니다. 도와 주셔서 감사합니다! (+1 n은 7 분 안에 ur ans를받습니다)
Hans Rudel

18
SetupGet ()은 내가 찾던 것입니다. 감사!
imnk 2015-06-05

저와 마찬가지로 클래스 속성에 SetUpGet ()을 사용했으며 작동합니다.
hussian

4

그러나 읽기 전용 속성을 모의한다는 것은 getter 메서드를 사용하는 속성을 의미하지만 가상으로 선언해야합니다. 그렇지 않으면 VB에서만 지원되기 때문에 System.NotSupportedException이 발생합니다. 왜냐하면 moq는 내부적으로 무언가를 모의 할 때 프록시를 재정의하고 생성하기 때문입니다.


1
그렇다면 인터페이스에서 읽기 전용 속성을 가상으로 선언하는 방법은 무엇입니까?
erict
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.