我有一个条件语句,应如下所示:
//...
if(_view.VerifyData != true)
{
//...
}
else
{
_view.PermanentCancellation.Cancel();
}
其中PermanentCancellation的类型为CancellationTokenSource。
我想知道如何在我的模拟_view中设置它。到目前为止所有尝试都失败了:(我无法在谷歌上找到一个例子。
任何指针都会受到赞赏。
答案 0 :(得分:2)
因为CancellationTokenSource.Cancel不是虚拟的,所以你不能用moq来模拟它。
您有两种选择:
创建一个包装器接口:
public interface ICancellationTokenSource
{
void Cancel();
}
以及委托给包装的CancellationTokenSource
的实现public class CancellationTokenSourceWrapper : ICancellationTokenSource
{
private readonly CancellationTokenSource source;
public CancellationTokenSourceWrapper(CancellationTokenSource source)
{
this.source = source;
}
public void Cancel()
{
source.Cancel();
}
}
并使用ICancellationTokenSource
作为PermanentCancellation
,然后您可以在测试中创建Mock<ICancellationTokenSource>
:
// arrange
var mockCancellationTokenSource = new Mock<ICancellationTokenSource>();
viewMock.SetupGet(m => m.PermanentCancellation)
.Returns(mockCancellationTokenSource.Object)
// act
// do something
// assert
mockCancellationTokenSource.Verify(m => m.Cancel());
并在您的生产代码中使用CancellationTokenSourceWrapper
。
或者使用支持模拟非虚拟成员的模拟框架,例如: