gpt4 book ai didi

c# - 测试异步方法时如何使用序列?

转载 作者:行者123 更新时间:2023-11-30 20:17:20 26 4
gpt4 key购买 nike

我正在使用 Moq.Sequences我在测试异步方法时遇到了麻烦。当我这样做时:

[Test]
public async Task Demo()
{
using (Sequence.Create())
{
_fooMock.Setup(f => f.Fooxiate()).InSequence();

_barMock.Setup(b => b.Baronize()).InSequence();

var result = await _cut.DoMyStuffAsync();

Assert.AreEqual("someString", result);
}
}

调用 _foo.Fooxiate() 时,我在生产代码中遇到异常:

Moq.Sequences.SequenceUsageException: 'Mock invocation can only be called with an active MockSequence created with MockSequence.Create()

是我做错了什么还是不支持在异步方法中测试调用顺序?

这里是完整的演示代码,包括上面提到的生产代码:

using System.Threading.Tasks;
using Moq;
using Moq.Sequences;
using NUnit.Framework;

namespace TestingAsync.Tests
{
[TestFixture]
public class SomeClassTests
{
private SomeClass _cut;

private Mock<IFoo> _fooMock;
private Mock<IBar> _barMock;

[SetUp]
public void Setup()
{
_fooMock = new Mock<IFoo>();
_barMock = new Mock<IBar>();

_cut = new SomeClass(_fooMock.Object, _barMock.Object);
}

[Test]
public async Task Demo()
{
using (Sequence.Create())
{
_fooMock.Setup(f => f.Fooxiate()).InSequence();

_barMock.Setup(b => b.Baronize()).InSequence();

var result = await _cut.DoMyStuffAsync();

Assert.AreEqual("someString", result);
}
}
}

public class SomeClass
{
private readonly IFoo _foo;
private readonly IBar _bar;

public SomeClass(IFoo foo, IBar bar)
{
_bar = bar;
_foo = foo;
}

public async Task<string> DoMyStuffAsync()
{
return await Task.Run(() => DoMyStuff());
}

private string DoMyStuff()
{
_foo.Fooxiate();

_bar.Baronize();

return "someString";
}
}

public interface IBar
{
void Baronize();
}

public interface IFoo
{
void Fooxiate();
}
}

最佳答案

This other answer正确解释了 Moq.Sequences doesn't 如何没有正确支持 async/await由于使用了 [ThreadStatic] .

根据 OP 的要求,我更新了该库以更好地支持现代并发编程模式。 (希望现在人们正在使用 Task 进行编程,而不是 Thread s。)

从版本 2.1.0 开始,您可以使用 AsyncLocal<Sequence> 使 Moq.Sequences 跟踪环境序列而不是 [ThreadStatic]多变的。这意味着环境序列可以“流动”跨越异步边界,例如 await。并且在延续中仍然可见(可能在不同的线程上运行)。

出于向后兼容性的原因,您目前需要在运行任何测试之前通过执行以下操作来选择加入新行为:

Sequence.ContextMode = SequenceContextMode.Async;

在撰写本文时,新行为尚未经过广泛测试so issue and bug reports are welcome .

关于c# - 测试异步方法时如何使用序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44968654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com