Moq:Veriy是否调用了Targetblock对象的SendAsync

时间:2018-01-16 07:30:10

标签: c# moq dataflow

我有一个通过引用ITargetBlock<T>对象初始化的类。在我的单元测试中,我想检查是否调用SendAsync<T> ITargetBlock<T>方法。所以我使用了以下验证码:

   this.targetFake.Verify(mock => mock.SendAsync(It.IsAny<InternalMessage>()), Times.Never());

调用此代码时,我收到以下异常:

  

System.NotSupportedException

     

的HResult = 0x80131515

     

消息=非虚拟(在VB中可覆盖)成员上的验证无效:mock =&gt; mock.SendAsync(It.IsAny())

     

源= Moq的

     

堆栈跟踪:

     

在Moq.Mock.ThrowIfVerifyNonVirtual(表达式验证,MethodInfo方法)

     

at Moq.Mock.Verify [T,TResult](Mock 1 mock, Expression 1表达式,Times times,String failMessage)

     

在Moq.Mock 1.Verify[TResult](Expression 1表达式,时间时间)

经过一些研究后,我发现SendAsyncITargetBlock中的一种扩展方法,无法模拟。

所以我猜我的单元测试方法在使用TPL数据流时不正确。任何人都可以给我一个如何测试类的提示:

 public class Detector
 {
     ...

     public Detector(ITargetBlock<FailureMessage> target, ITimer timer)
     {
         _target = target;
         _timer.Elapsed = TimerElapsed;
         ...
     }

     private async void TimerElapsed(object sender, ElapsedEventArgs e) 
     {
          bool errorCondition = false;

          // Perform checks that set errorCondition to true
          ...

          if (errorCondition)
          {
               var rv = await SendAsync(new FailureMessage());
               ...
          }

          ...
      }
 }

我的想法是注入ITimer装饰者。使用ITimer界面可以模拟单元测试环境中已用的计时器。

THX

0 个答案:

没有答案