我有一条条件语句,其内容应如下所示:

//...
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(商业)

10-08 19:48