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

前端之家收集整理的这篇文章主要介绍了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>()语法,并且模拟将按照您期望的行为.

原文链接:https://www.f2er.com/csharp/94414.html

猜你在找的C#相关文章