члены Интерфейса Насмешки 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. Объект как PaymentTransaction)

в методе я тестирую (как это, только берет PaymentTransaction и не ITransaction, я не могу изменить его ни один), отладчик показывает нулевую ссылку в течение времени записи и времени выхода.

Я задавался вопросом, мог ли кто-то помочь мне.

Спасибо в ожидании.

10
задан Raghu 15 January 2010 в 03:50
поделиться

2 ответа

[11746527-

Единственные способы, которыми я смог обойти этот вопрос (и это похоже на взлом в любом случае) - это либо делать то, что вы не хотите делать, и сделать свойства на Бетонный класс виртуальный (даже для реализации интерфейса) или, также для явного реализации интерфейса на вашем классе. Например:

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

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

затем, когда вы создаете свой издевательства, вы можете использовать как () синтаксис, и их будет вести себя ведут, как вы ожидаете.

3
ответ дан 4 December 2019 в 04:21
поделиться

Убедитесь, что при компиляции использовался параметр -g.

-121--2887361-

Это работает для меня -

public partial class MyEntity: IEntity 
 {    [Column(Name = "IDfield", Storage = "_IDfield", IsDbGenerated = true)]
      public int ID 
       {         
          get { return this.IDfield; }        
          set { this.IDfield=value;  }    
       } 
 }
-121--3367986-

Вы издеваетесь над конкретным классом, поэтому, я думаю, вы сможете издеваться только над виртуальными членами (они должны быть переопределяемыми).

0
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: