Проверка метода, вызываемого с определенным производным параметром

#moq

#moq

Вопрос:

Рассмотрим следующий фрагмент;

 public enum ReportType {Monthly,Quarterly}
public class BaseReport
{
  public ReportType ReportType {get;set;}
}

public class MonthlyReport : BaseReport 
{
   public String month = "January" 
   public MonthlyReport() { ReportType = Monthly;}
}

public class Foo
{
    public virtual void AddReport(BaseReport report);
}
[Test]
public void Test1()
{
    var mock = new Mock<Foo>(){CallBase =true};
    var report = new MonthlyReport();
    mock.Object.AddReport(report);
}
  

Ну, я пытаюсь проверить, вызывается ли AddReport() с определенным параметром здесь;

 mock.Verify(x => x.AddReport(It.Is<MonthlyReport>(p => p.month == "January" amp;amp;
                                                       p.ReportType == ReportType.Monthly))); 
  

Как я и опасался, он не работает с параметром MonthlyReport для Is<>, даже если он получен из BaseReport . Если я использую Is , то я не могу использовать p.month в выражении, и я не настолько хорошо разбираюсь в c #, чтобы знать, могу ли я использовать if(p is MonthlyReport) в лямбда-выражении или, что более важно, оно будет работать по назначению.

Как я могу подойти к этой проблеме? Пожалуйста, обратите внимание, что макет является частичным, хотя я могу смириться с подходом настройки с обратными вызовами, если он аккуратно решает мою проблему. Любые указатели будут высоко оценены…

Комментарии:

1. Я не понимаю, что вы пытаетесь сделать. Вы вызываете AddReport в самом тесте. Почему вам также нужно проверять, что вы его вызвали? Разве вы не должны использовать Verify только тогда, когда хотите убедиться, что какой-то реальный код вызвал метод?

2. это всего лишь пример, который я привел, чтобы продемонстрировать проблему, в реальном коде я внедряю макет в тестируемый класс, и на самом деле это не проблема.

3. Просто запустил ваш код, и он работает для меня.

4. Будь я проклят. Да, вы правы. Проблема заключалась не в общем параметре, а в предположении, которое я сделал в предикате (в терминах этого примера месяц не был январем). В этом случае мне нужна лучшая отчетность, я задаюсь вопросом Assert. isTrue(p.month== «Январь») будет работать в выражении