c# - 最小起订量方法调用顺序

标签 c# unit-testing moq

我正在模拟我们用于某些企业库调用的包装器。世界上一切都很好,我的测试通过了,实际代码工作了!

但是我随后扩展了功能,并验证了所有测试仍然通过。宾果 - 他们做到了。然而他们并没有在现实世界中,因为有一个期望

InitialiseDBCommand(string, commandtype)

之前会调用

AddCmdParameter(string, dbtype, object)

所以像个好 child 一样,我要做的第一件事就是编写一个测试来展示这种行为并期望抛出异常。

我需要的是设置 AddCmmParater 以在未使用任何字符串调用 InitialDBCommand 时抛出异常。

我想我可以通过回调来做到这一点,但感觉应该有一个方法调用序列(而不是方法返回序列)。

有点像

iDataAccessHelper.Setup(s=>s.AddCmdOutputParameter(It.IsAny<string>(), 
                  It.IsAny<DbType>(), 
                  It.IsAny<int>()))
              .When(w=>w.InitialiseDBCommand(etc etc)
              .Throws<NullReferenceException>()

有什么建议吗?

最佳答案

好吧,如果您只是想测试是否以正确的顺序调用了 2 个方法,一种方法是添加一个计数器,每次调用其中一个方法时该计数器都会递增,然后检查它是否是正确的数字. Here是描述它的一个答案。 以下是我为您的场景编写的方式:

[Test]
public void TestingCallOrder() {
    int counter = 0;
    var mockDataAccessStuff = new Mock<IDataAccessStuff>();
    mockDataAccessStuff.Setup(x => x.AddCmdParameter(It.IsAny<string>())).Callback(() => {
        Assert.AreEqual(counter, 0);
        counter++;
    });

    mockDataAccessStuff.Setup(x => x.InitialiseDbCommand(It.IsAny<string>())).Callback(() => {
        Assert.AreEqual(counter, 1);
        counter++;
    });

    // more of the same
    var myClass = new ClassThatImTesting(mockDataAccessStuff.Object);
    myClass.DoWork();

    // make sure both methods are called at least once ...
    mockDataAccessStuff.Verify(x => x.AddCmdParameter(It.IsAny<string>()), Times.Once());
    mockDataAccessStuff.Verify(x => x.InitialiseDbCommand(It.IsAny<string>()), Times.Once());
}

我认为这是编写测试的一种非常简洁和可读的方式。

关于c# - 最小起订量方法调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24084511/

相关文章:

java - 使用什么来代替简单的 JdbcTestUtils?

.net - 如何使用 Moq 模拟 ISerializable 类?

c# - 单元测试静态实用程序类

c# - 我的 ViewData 如何可以为空,但可以在调试器中扩展?

c# - 在 Xamarin/Maui C# 库中找不到 RegisterForActivityResult?

c# - 对 WCF 客户端的异步调用会阻止后续的同步调用

c++ - 我们如何在不注册 dll 的情况下对我们的 c++ COM 代码进行单元测试?

unit-testing - jest.fn() 有什么作用以及如何使用它?

c# - 为同一方法的两次调用设置两个不同的返回值

c# - 如何使用 .NET 在 Windows 窗体中显示 Windows 文件夹内容?