【发布时间】:2022-01-07 16:40:39
【问题描述】:
我想对以下方法进行单元测试:
public async IAsyncEnumerable<string> ReadFileAsStream([EnumeratorCancellation] CancellationToken cancellationToken = default)
{
using (var reader = _readerWrapper.GetStreamReader("File.csv"))
{
await reader.ReadLineAsync();
string? line;
while ((line = await reader.ReadLineAsync()) != null)
{
cancellationToken.ThrowIfCancellationRequested();
yield return line;
}
}
}
我需要一个 CancellationToken 的模拟,以便我可以设置它的 ThrowIfCancellationRequested 方法来引发异常。但是,CancellationToken 是一个结构,我不能使用 Moq。
有人知道如何模拟 CancellationToken 吗?
【问题讨论】:
-
在调用 ReadFileAsStream 之前,是否有什么阻止您使用实际的 CancellationToken 并取消它?
-
是的,我想写一个单元测试。根据定义,单元测试应该隔离所有依赖项。如果我使用实际的 CancellationToken 并取消它 - 那么这将是一个集成测试。
-
@MiBuena,在我看来,您对此毫无意义的教条主义。如果您的方法将这些作为参数,您是否应该尝试弄清楚如何模拟
int或DateTime?当然不是——那不是“集成”测试。 -
如果您说取消是终止外部服务的套接字,那么可以肯定:这可能是一个集成测试;这里?不;那仍然是一个单元测试;无论哪种方式:我们怎么称呼它重要吗?(修辞:我在这里寻找的答案是“不”)。唯一重要的是我们测试代码,您可以使用
CancellationTokenSource
标签: c# unit-testing cancellation-token