我如何使用 FakeItEasy 伪造 returns 随着时间的推移不同答案的东西?

How can I fake something which returns different answers over time using FakeItEasy?

我正在尝试使用 FakeItEasy 伪造一个密封的外部音频源。

我已经包装了音频源并成功伪造了包装器,所以我知道基础知识是正确的。这是我目前坚持的一点:

音频源 returns 在使用 Play() 调用后 isPlaying = true。 isPlaying 将保持为 true,直到音频剪辑播放完毕,此时它将 return 变为 false。

我可以使用以下代码伪造第一部分:

A.CallTo(() => fakeAudioSourceWrapper.Play())
    .Invokes(() => fakeAudioSourceWrapper.isPlaying = true)

在调用Play函数后成功假装isPlaying为真。我想做的是延迟一定时间,然后将其设置为 return false 以模拟剪辑播放完毕后发生的情况。

我试过了

    A.CallTo(() => fakeAudioSourceWrapper.Play())
        .Invokes(() => fakeAudioSourceWrapper.isPlaying = true)
        .Then
        .Invokes(() => fakeAudioSourceWrapper.isPlaying = false);

认为在调用 Play() 后第一次调用 isPlaying 时 return 为真,第二次 return 为假,但没有任何乐趣。

有办法吗?

如果 Play 被多次调用,您的解决方案可能会起作用,因为您正在配置 Play 的功能(尽管我认为您切换了 true 和 false)。我从问题中猜测 Play 只被调用了一次。在这种情况下,您希望 Play 执行将设置 changing behaviour between calls to isPlaying.

的操作

考虑这个通过测试中的方法,其中 Play 导致 isPlaying 到 return true 恰好一次(未配置 bool-returning 的默认行为Fake的方法是 return false):

public interface IAudioSourceWrapper {
    public bool isPlaying {get;set;}
    public void Play();
}

[Fact]
public void PlayThenDoNotPlay()
{
    var fakeAudioSourceWrapper = A.Fake<IAudioSourceWrapper>();
    A.CallTo(() => fakeAudioSourceWrapper.Play())
        .Invokes(() => {
            A.CallTo(() => fakeAudioSourceWrapper.isPlaying).Returns(true).Once();
        });

    fakeAudioSourceWrapper.isPlaying.Should().Be(false);
    fakeAudioSourceWrapper.Play();
    fakeAudioSourceWrapper.isPlaying.Should().Be(true);
    fakeAudioSourceWrapper.isPlaying.Should().Be(false);
}