Moq、SetupGet、プロパティのモック


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>Returns、引数(または戻り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を受け入れます)
ハンスルーデル

18
SetupGet()は私が探していたものでした。ありがとう!
imnk 2015年

私と同じように、クラスプロパティにSetUpGet()を使用すると、機能します。
hussian 2018

4

ただし、読み取り専用プロパティをモックするということは、getterメソッドのみを使用するプロパティを意味しますが、それ以外の場合は仮想として宣言する必要があります。そうしないと、Moqが内部的にオーバーライドしてプロキシを作成するため、VBでのみサポートされるため、System.NotSupportedExceptionがスローされます。


1
では、どのようにして読み取り専用プロパティをインターフェイスで仮想として宣言するのでしょうか。
2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.