【问题标题】:c# Mocking Interface members of a concrete class with Moqc# 使用 Moq 模拟具体类的接口成员
【发布时间】:2011-01-05 09:05:17
【问题描述】:

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

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

感谢期待。

【问题讨论】:

    标签: c# class interface moq concrete


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我知道我在模拟一个具体的类,但是考虑到进入和退出时间道具是接口成员并且我正在将我的具体模拟对象转换为接口,我不应该需要制作这些道具虚拟的。我只是想知道是否还有其他方法可以做到这一点。
      • 那么你终于找到答案了吗?你是怎么做到的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      相关资源
      最近更新 更多