3

パラメーター化されたコンストラクターを使用してオブジェクトをモックしているときに、コンストラクター内で初期化されているプロパティが仮想の場合、Moq はプロパティ値を設定しません。ただし、非仮想プロパティの場合は、Moq が値を設定します。

以下は、私がモックしたい私のクラスです。

public class Activity
{
    private Activity() {}
    public Activity(string code, string description, string option)
    {
        if(string.IsNullOrEmpty(code)) throw  new ArgumentNullException("code");
        if (string.IsNullOrEmpty(option)) throw new ArgumentNullException("option");

        Code = code;
        Description = description;
        Option = option;
    }

    public virtual string Code { get; private set; }
    public virtual string Description { get; private set; }
    public virtual string Option { get; private set; }

}

これは私がそれをモックしようとする方法です:

    [TestMethod]
    public void It_Creates_Mock_For_A_Class()
    {
        var mock = new Mock<Activity>("Code 1", null, "Option");
        Assert.IsNotNull(mock.Object);
        Assert.AreEqual("Code 1", mock.Object.Code);
    }

テスト メソッドは次のように言って失敗します: Assert.AreEqual が失敗しました。期待される:。実際:<(null)>。

しかし、すべてのプロパティから virtual キーワードを削除すると、機能してテスト ケースに合格します。

Entity Framework のため、プロパティを仮想に保つ必要があります。

どんな手掛かり?この問題を回避するにはどうすればよいですか?

4

1 に答える 1

3

「CallBase」プロパティを true に設定すると、問題が解決することがわかりました。

オブジェクト ブラウザーでアセンブリを見ると、要約には次のように記載されています。

概要: セットアップが一致しない場合に、モック化されたクラスに対して基本メンバーの仮想実装が呼び出されるかどうか。デフォルトは false です。

動作するコード:

    [TestMethod]
    public void It_Creates_Mock_For_A_Class()
    {
        var mock = new Mock<Activity>("Code 1", null, "Option");
        mock.CallBase = true;
        Assert.IsNotNull(mock.Object);
        Assert.AreEqual("Code 1", mock.Object.Code);
    }
于 2013-10-23T12:22:47.607 に答える