【问题标题】:Mocking an interface vs mocking with a class模拟接口与模拟类
【发布时间】:2014-05-20 23:26:12
【问题描述】:

在这方面需要一些建议...我是模拟东西的新手,正在编写一些 MOQ 测试...我在一个我必须测试的界面上磕磕绊绊:

假设我有这个界面:

 interface  IAWClient
 {
     void Login( string );
 }     

我已经这样写了我的 MOQ 测试......

最小起订量测试 1:

 [Test]
 public void LoginTest()
 {
     Mock<IAWClient> m = new Mock<IAWClient>();
     m.Setup(x => x.Login("Joe"));

     m.Object.Login("Joe");  <<-- this is the line I am interested in
 }

但是已经看到了许多使用具体类来测试接口的示例......例如:

 public class AdmissionMngr
 {
     IAWClient m_IAWClient;
     public AdmissionMngr( IAWClient iaw )
     { 
         m_IAWClient = iaw;   
     }

     public void Admit(string name)
     {
         m_IAWClient.Login(name);
     }
 }

使用这样的模拟测试:

最小起订量测试 2:

 [Test]
 public void LoginTest()
 {
     Mock<IAWClient> m = new Mock<IAWClient>();

     m.Setup(x => x.Login("Joe"));

     AdmissionMngr admin = new AdmissionMngr(m.Object);

     admin.Admit("Joe");  <<-- this is the line I am interested in
 }

对于指示的两行... MOQ 测试 1 和 MOQ 测试 2 是否等效? 为什么或为什么不?

非常感谢!

【问题讨论】:

  • 嗯,在这两种情况下,在模拟上调用的方法是相同的。两者最终都使用字符串 "Joe" 调用 Login 方法一次。您可以通过使用调试器运行两者来查看这一点。您使用哪一种取决于您要测试的内容。例如,后者可能是测试AdminMngr 类的好方法。第一个测试似乎毫无用处;您正在创建一个模拟并告诉它期待某个方法调用,然后自己显式地执行该方法调用。这总是会成功的,不会告诉你任何事情。
  • 模拟就像一个被掏空的类,它去掉了里面所有的逻辑。您不想测试模拟。如果这样做,您将测试 Moq 的行为方式,而不是您的班级。

标签: c# interface moq


【解决方案1】:

这就是依赖注入的样子。您正在测试AdmissionMngr,但为了确保您不测试该经理使用的IAWClient,您创建模拟IAWClient 实现(使用模拟框架)并将其作为依赖项传递给对象构造函数。

关于您发布的代码:

第一个实际测试了模拟对象,所以在我看来这是没有意义的。第二个测试 AdmissionMngr 并模拟其依赖关系,这在单元测试中非常常见。

【讨论】:

  • 我了解事物的依赖注入方面......这是有道理的......我不确定最小起订量测试之间的区别是什么?他们做同样的事情吗?
  • 起订量测试 1 中的起订量代码是否有任何作用( m.Object.Login("Joe"); )?
  • 不,第一个测试mocked方法可以被调用,只需调用它。第二个测试AdmissionMngr 在内部调用IAWClient.Login 作为Admit 方法调用的一部分。
【解决方案2】:

您的模拟存在是为了注入其他测试用例。你不测试你的模拟......他们总是会产生你告诉他们产生的东西(你的第一个例子就是这样做的)。

当你模拟某些东西时 - 它不是在测试中。您使用模拟来测试需要该类型对象才能运行的其他内容。你可以让它提供一些预期的输入,但另一个对象应该基于它产生一些预期的输出。

所以,你的第二个例子是要走的路。

【讨论】:

    猜你喜欢
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多