9

プライベート内部クラスの単体テストをセットアップしようとしましたが、ほとんど成功しませんでした。

namespace Stats.Model
{
  public class DailyStat
  {
    private class DailyStatKey // The one to test
    {
      private DateTime date;
      public DateTime Date 
      { 
        get { return date; }
        set { date = value.Date; }
      }

      public StatType Type { get; set; }

      public override int GetHashCode()
      {
        return Date.Year * 1000000 +
               Date.Month * 10000 +
               Date.Day * 100 +
               (int)Type;
      }

      public override bool Equals(object obj)
      {
        DailyStatKey otherKey = obj as DailyStatKey;
        if (otherKey == null)
          return false;
        return (this.Date == otherKey.Date && this.StatType == otherKey.StatType);
      }
    }
  }
}

私はこのコードを試しました:

PrivateType statKeyType = new PrivateType("Stats.Model", "Stats.Model.DailyStat.DailyStatKey");

と同様

PrivateType statKeyType = new PrivateType("Stats.Model", "DailyStat.DailyStatKey");

無駄に。

アセンブリの名前は「Stats.Model」で、タイプ名も正しいように見えますが、「System.TypeLoadException:タイプを読み込めませんでした」という例外が発生します。

だから私は何が間違っているのですか?

私の知る限り、PrivateTypeはリフレクションベースであり、名前空間のすぐ下にプライベートクラスを設定することはできないため、このシナリオを対象としていると思います。

編集:

DailyStatKeyの完全な実装を追加しました。テストしたいのは、GetHashCodeメソッドの一意性です。ご覧のとおり、日付と型を1つの整数に収めようとしています。

4

4 に答える 4

11

自分で解決策を見つけました:

var parentType = typeof(DailyStat);
var keyType = parentType.GetNestedType("DailyKeyStat", BindingFlags.NonPublic); 
//edited to use GetNestedType instead of just NestedType

var privateKeyInstance = new PrivateObject(Activator.CreateInstance(keyType, true));

privateKeyInstance.SetProperty("Date", DateTime.Now);
privateKeyInstance.SetProperty("Type", StatType.Foo);

var hashCode = (int)privateKeyInstance.Invoke("GetHashCode", null);
于 2010-07-08T15:01:32.843 に答える
5

PrivateType を直接使用することもできます。

PrivateType statKeyType = new PrivateType("Stats.Model", "Stats.Model.DailyStat+DailyStatKey");

ネストされたクラスの文字列形式は名前空間 (Stats.Model.DailyStat.DailyStatKey) とは異なるため、使用法は明らかではありません。

于 2014-03-27T22:51:51.900 に答える
1

プライベートであるため、インスタンスを作成できるクラスはDailyStatそれ自体だけです。非プライベートリフレクション(アクティベーター)にしない限り、クラスを作成する場合は唯一の選択肢になりますが、十分に公開できない限り直接使用することはできないため、これはお勧めできません。タイプまたはインターフェース

編集:

ユニットテストのためにこれを実行しようとしているので、このクラスはプライベートであるため、効果的にテストしないでください。のパブリックインターフェイスを介してのみテストできますDailyStat

于 2010-07-08T05:34:49.083 に答える
-2

親クラスでパブリックな「GetDailyStatKey」メソッドをコーディングできます。

public class DailyStat
{
    private class DailyStatKey // The one to test 
    {
    }
    public DailyStatKey GetDailyStatKey()
    {
        return new  DailyStatKey();
    }
}

これで、次のように記述できます。

DailyStat v = new DailyStat();
var x =  v.GetDailyStatKey();
于 2010-07-08T05:56:26.707 に答える