【问题标题】:How to test a void method with Moq?如何使用 Moq 测试 void 方法?
【发布时间】:2012-02-16 19:00:50
【问题描述】:

我是 TDD 的新手,我还有很多问题,其中一个问题是如何测试 void 方法!

我有这个参数通过引用传递,我不知道如何测试:(这只是一个测试,不是我真正的方法)

public void ReplaceCenter(ref string cod, ref string name)
    {
        User user = userDAO.GetSomething();

        if (user.Cod != null)
        {
            cod = user.Cod;
        }

        if (user.Name != null)
        {
            name = user.Name;
        }
    }            

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    假设 userDAO 作为依赖注入并且可以被模拟,我会做以下测试:

    1. 断言GetSomething() 被模拟userDAO 调用
    2. 断言返回的引用字符串cod == 在 User.Cod 中传递了我们 用于创建模拟userDAO
    3. 断言返回的引用字符串name == 在 User.Cod 中传递 我们曾经创建模拟userDAO

    我同意避免使用 ref 参数,但我建议按照@Tim Cools 在其他答案中的建议进行重构

    【讨论】:

    • 这个概念现在对我来说不是很清楚。我如何在测试中模拟我的方法中的 dao?我将如何模拟结果以在方法中使用?因为我不能通过参数传递它,所以他不是其中之一!对不起,我还是很菜鸟!
    • 您可以将模拟的userDAO 作为构造函数参数传递给包含ReplaceCenter 方法的类
    【解决方案2】:

    you should try to avoid ref and out parameters. 使用包含这两个属性的对象。这将使您的设计更简洁,您的工作也更简洁......

    编辑:如果你真的想最小起订量使用输出参数,你可以找到一个例子here

    【讨论】:

      【解决方案3】:

      调用方法后只需测试参数中的值,模拟 userDAO 以控制它返回的内容(null、cod、name)

      【讨论】:

      • 如果它们不是通过引用传递的?我还能做吗?
      • 如果你没有通过引用传递它们,你会返回任何东西吗?如果是这样,请针对返回值进行测试,如果它只对其他事物起作用,那么您测试这些依赖项是否使用正确的参数调用
      【解决方案4】:

      void 方法意味着会有某种副作用。如果可能,我通常建议避免使用它们,但是当您确实需要测试它们时,一般的经验法则是:

      1. 断言对您的模拟进行了所有预期的调用。
      2. 如果可能,断言使用特定参数值调用模拟。这对于 void 方法更为重要,因为您正在测试副作用。
      3. 尽可能声明所有副作用,包括那些不应该改变的副作用。

      确实,这些断言也应该用于非 void 方法,也许更多是为了防止意外的副作用,而不是测试预期的副作用。 (IMO,如果可能,函数应该具有零副作用。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-27
        • 2012-07-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 1970-01-01
        相关资源
        最近更新 更多