c#用Moq模拟具体类的接口成员

我有一个接口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,我也不能更改它),调试器显示入口时间和退出间的空引用.

我想知道有人能帮我吗

感谢预期.

解决方法

我能够解决这个问题的唯一方法(它感觉像是一个黑客)是要做你不想做的,并使具体类的属性虚拟(即使是接口实现),或者也明确地实现你的类的接口.例如:
public DateTime EntryTime
{
  get  { return ((ITransaction)this).EntryTime; }
}

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

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

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么