我有一个通过引用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表达式,时间时间)
经过一些研究后,我发现SendAsync
是ITargetBlock
中的一种扩展方法,无法模拟。
所以我猜我的单元测试方法在使用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