检查是否使用Moq调用了CancellationTokenSource.Cancel()

时间:2012-09-04 13:11:27

标签: c# c#-4.0 moq task-parallel-library cancellationtokensource

我有一个条件语句,应如下所示:

//...
if(_view.VerifyData != true)
{
    //...
}
else
{
    _view.PermanentCancellation.Cancel();
}

其中PermanentCancellation的类型为CancellationTokenSource。

我想知道如何在我的模拟_view中设置它。到目前为止所有尝试都失败了:(我无法在谷歌上找到一个例子。

任何指针都会受到赞赏。

1 个答案:

答案 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

或者使用支持模拟非虚拟成员的模拟框架,例如: