gpt4 book ai didi

c# - 如何使用 Moq 测试方法调用顺序

转载 作者:IT王子 更新时间:2023-10-29 04:14:16 31 4
gpt4 key购买 nike

目前我有:

    [Test]
public void DrawDrawsAllScreensInTheReverseOrderOfTheStack() {
// Arrange.
var screenMockOne = new Mock<IScreen>();
var screenMockTwo = new Mock<IScreen>();
var screens = new List<IScreen>();
screens.Add(screenMockOne.Object);
screens.Add(screenMockTwo.Object);
var stackOfScreensMock = new Mock<IScreenStack>();
stackOfScreensMock.Setup(s => s.ToArray()).Returns(screens.ToArray());
var screenManager = new ScreenManager(stackOfScreensMock.Object);
// Act.
screenManager.Draw(new Mock<GameTime>().Object);
// Assert.
screenMockOne.Verify(smo => smo.Draw(It.IsAny<GameTime>()), Times.Once(),
"Draw was not called on screen mock one");
screenMockTwo.Verify(smo => smo.Draw(It.IsAny<GameTime>()), Times.Once(),
"Draw was not called on screen mock two");
}

但是我在生产代码中绘制对象的顺序并不重要。我可以先做一个,或者两个都没关系。然而,这应该很重要,因为绘制顺序很重要。

您如何(使用 Moq)确保按特定顺序调用方法?

编辑

我摆脱了那个测试。 draw 方法已从我的单元测试中删除。我只需要手动测试它的工作原理。尽管顺序颠倒被带到了一个单独的测试类中进行了测试,所以它并不全是坏事。

感谢提供有关他们正在研究的功能的链接。我当然希望它能尽快添加,非常方便。

最佳答案

我最近创建了 Moq.Sequences,它提供了在 Moq 中检查订单的能力。您可能想阅读我的 post描述了以下内容:

  • 支持方法调用、属性setter 和 getter。
  • 允许您指定数量特定调用的时间应该是预期。
  • 提供循环,让你将调用分组到一个循环组中。
  • 允许您指定号码应该预期出现循环的次数。
  • 预期会被调用的调用按顺序可以与预期按任何顺序进行的调用。
  • 多线程支持。

典型用法如下:

[Test]
public void Should_show_each_post_with_most_recent_first_using_sequences()
{
var olderPost = new Post { DateTime = new DateTime(2010, 1, 1) };
var newerPost = new Post { DateTime = new DateTime(2010, 1, 2) };
var posts = new List<Post> { newerPost, olderPost };

var mockView = new Mock<BlogView>();

using (Sequence.Create())
{
mockView.Setup(v => v.ShowPost(newerPost)).InSequence();
mockView.Setup(v => v.ShowPost(olderPost)).InSequence();

new BlogPresenter(mockView.Object).Show(posts);
}
}

关于c# - 如何使用 Moq 测试方法调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1765738/

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