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 对象的所有三个属性。

我尝试了以下方法,但它不起作用:

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)

在我正在测试的方法中(因为它只需要一个 PaymentTransaction 而不是 ITransaction,我也无法更改它)调试器显示进入时间和退出时间的空引用。

我想知道是否有人可以帮助我。

感谢期待。

4

2 回答 2

3

我能够解决这个问题的唯一方法(无论哪种方式都感觉像是一种黑客行为)是要么做你不想做的事情,要么让具体类的属性虚拟化(即使是接口实现) ,或者也显式地在您的类上实现接口。例如:

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

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

然后,当您创建 Mock 时,您可以使用该As<ITransaction>()语法,并且该模拟将按照您的预期运行。

于 2010-01-15T06:42:10.970 回答
1

您正在模拟一个具体的类,所以我想您只能模拟虚拟的成员(它们必须是可覆盖的)。

于 2010-01-15T04:51:52.137 回答