我有一条条件语句,其内容应如下所示:
//...
if(_view.VerifyData != true)
{
//...
}
else
{
_view.PermanentCancellation.Cancel();
}
其中PermanentCancellation的类型为CancellationTokenSource。
我想知道我应该如何在_view的模拟中进行设置。到目前为止,所有尝试均失败了:(我无法在Google上找到示例。
任何指针将不胜感激。
最佳答案
由于CancellationTokenSource.Cancel不是虚拟的,因此无法使用最小起订量来模拟它。
您有两种选择:
创建包装器接口:
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
。或使用支持模拟非虚拟成员的模拟框架,例如:
Microsoft Fakes
Typemock isolator(商业)
JustMock(商业)