模拟接口vs模拟类



需要一点建议…我是模拟东西的新手,正在编写一些最小起订量测试……我遇到了一个需要测试的界面:

假设我有这样一个接口:

 interface  IAWClient
 {
     void Login( string );
 }     

我是这样写我的最小起订量测试的

最小起订量测试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
 }

对于指示的两行…最少起订量测试1和最少起订量测试2是否相等?为什么或者为什么不呢?

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

关于你发布的代码:

第一个实际上是测试模拟对象,所以在我看来它是没有意义的。第二个测试是模拟AdmissionMngr的依赖,这在单元测试中是很常见的做法。

您的模拟将被注入到其他测试用例中。你不测试你的模拟…它们总是会生成你让它们生成的东西(你的第一个例子就是这样做的)。

当你嘲笑某事时-它没有被测试。您可以使用mock来测试需要该类型对象才能运行的其他内容。您可以让它提供一些预期的输入,但是另一个对象应该基于它产生一些预期的输出。

所以,你的第二个例子是正确的。

最新更新