如何使用Moq测试void方法

本文关键字:void 方法 测试 Moq 何使用 | 更新日期: 2023-09-27 18:24:49

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

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

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;
        }
    }            

有人能帮忙吗?谢谢

如何使用Moq测试void方法

假设userDAO是作为依赖项注入的,并且可以被模拟,我会进行以下测试:

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

不过,我同意避免使用ref参数,我建议按照@Tim Cools

的另一个答案进行重构

您应该尽量避免ref和out参数。使用包含这两个属性的对象。这会让你的设计更干净,你的工作也更干净。。。

edit:如果你真的想使用moq输出参数,你可以在这里找到一个例子

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

void方法意味着会有某种副作用。如果可能的话,我通常建议避免它们,但当你确实需要测试一个时,一般的经验法则是:
  1. 断言对mock的所有预期调用都已完成
  2. 如果可能的话,断言mock是用特定的参数值调用的。这对于void方法更为重要,因为您正在测试副作用
  3. 断言你能断言的每一个副作用,包括那些不应该改变的副作用

实际上,这些断言也应该针对非void方法,也许更多的是为了防止意外的副作用,而不是测试预期的副作用。(IMO,如果可能的话,一个函数应该没有任何副作用。)