如何使用Moq测试void方法?

时间:2012-02-16 19:00:50

标签: c# unit-testing moq

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

有些人可以帮忙吗?谢谢!

4 个答案:

答案 0 :(得分:5)

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

  1. 在模拟的GetSomething()
  2. 上调用了断言userDAO
  3. 断言返回的引用字符串cod ==在User.Cod中传递给我们 用于创建模拟userDAO
  4. 断言返回的引用字符串name ==传递给User.Cod 我们曾经创建过模拟的userDAO
  5. 我同意避免使用ref参数,我建议按@Tim Cools的其他答案中的建议进行重构

答案 1 :(得分:3)

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

编辑:如果你真的想要moq out参数使用你可以找到一个例子here

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

  1. 断言所有预期的嘲讽电话。
  2. 如果可能,断言使用特定参数值调用模拟。这对于void方法更为重要,因为您正在测试副作用。
  3. 断言你可以做的每一个副作用,包括那些不应该改变的副作用。
  4. 实际上,这些断言也应该用于非空方法,或许更多是为了防止意外的副作用,而不是测试预期的副作用。 (IMO,如果可能的话,函数应该没有副作用。)