10

次のようなインターフェイス ITransaction があります。

public interface ITransaction {

        DateTime EntryTime { get; }

        DateTime ExitTime { get; }
}

そして、次のような派生クラス PaymentTransaction があります。

public class PaymentTransaction : ITransaction {

        public virtual DateTime LastPaymentTime
        {
            get { return DateTime.Now; }
        }

        #region ITransaction Members

        public DateTime EntryTime
        {
            get  { throw new NotImplementedException(); }
        }

        public DateTime ExitTime
        {
            get  { throw new NotImplementedException(); }
        }

        #endregion
}

PaymentTransaction オブジェクトの 3 つのプロパティすべてをモックしたかったのです。

私は次のことを試しましたが、うまくいきません:

var mockedPayTxn = new Mock<PaymentTransaction>();
mockedPayTxn.SetUp(pt => pt.LastPaymentTime).Returns(DateTime.Now); // This works

var mockedTxn = mockedPayTxn.As<ITransaction>();
mockedTxn.SetUp(t => t.EntryTime).Returns(DateTime.Today); 
mockedTxn.SetUp(t => t.ExitTime).Returns(DateTime.Today); 

でも注射したら

(mockedTxn.Object は PaymentTransaction として)

私がテストしているメソッドでは (ITransaction ではなく PaymentTransaction のみを使用するため、変更することもできません)、デバッガーは開始時間と終了時間に対して null 参照を示します。

誰かが私を助けてくれるかどうか疑問に思っていました。

ありがとうございます。

4

2 に答える 2

3

私がこの問題を回避できた唯一の方法は (どちらにしてもハックのように感じます)、やりたくないことを行い、具象クラスのプロパティを仮想化することです (インターフェイスの実装であっても)。 、またはクラスにインターフェイスを明示的に実装することもできます。例えば:

public DateTime EntryTime
{
  get  { return ((ITransaction)this).EntryTime; }
}

DateTime ITransaction.EntryTime
{
  get { throw new NotImplementedException(); }
}

次に、モックを作成するときにAs<ITransaction>()構文を使用すると、モックは期待どおりに動作します。

于 2010-01-15T06:42:10.970 に答える
1

あなたは具体的なクラスをモックしているので、仮想のメンバーしかモックできないと思います(それらはオーバーライド可能でなければなりません)。

于 2010-01-15T04:51:52.137 に答える