如何测试带有 TokenSource 取消的方法?

How to test a method with TokenSource cancellation?

我对取消 TokenSource 的方法进行单元测试时遇到问题。

SUT方法很简单:

public void OnTaskCancellationExecute(object obj)
        {
            TaskCancellation = true;

            TokenSource.Cancel();

            CommandCompletedControlsSetup();
        }

并被命令执行调用:

TaskCancellationCommand = new DelegateCommand(OnTaskCancellationExecute);

CommandCompletedControlsSetup方法,在TokenSource取消后执行,包含:

TaskCancellation = false;

我的测试方法:

[Fact]
    public void OnTaskCancellationExecute_CancelTask_True()
    {
        _viewModel.TaskCancellation = false;
        _viewModel.TokenSource = new CancellationTokenSource();

        _viewModel.TaskCancellationCommand.Execute(null);

        Assert.True(_viewModel.TaskCancellation);
    }

在 SUT 中使用 TokenSource 取消所有任务在 运行 解决方案中需要一段时间。但不是在单元测试中。我应该如何 Assert_viewModel.TaskCancellationtrue,然后在测试方法中调用 CommandCompletedControlsSetup 后再次更改为 false?还是我的架构有问题?我应该在测试方法中创建一些任务并以某种方式附加 SUT 令牌吗?

这样是不行的。由于您在输入方法后立即将 TaskCancellation 显式 设置为 true,因此您不需要测试 属性 本身。它当然会起作用。如果 TaskCancellation 的值是一个操作的结果,您将单独测试这个操作。如果 TaskCancellation 的值是条件的结果,您将单独测试该条件。要测试您的示例代码,您首先要在命令执行后断言 TokenSource.IsCancellationRequestedtrue。然后写第二个测试用例来测试CommandCompletedControlsSetup().