模拟界面与模拟类

时间:2014-05-20 23:26:12

标签: c# interface moq

需要一点建议...我是嘲笑东西的新手,我正在编写一些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 Test 1和MOQ Test 2等效? 为什么或为什么不呢?

非常感谢你!

2 个答案:

答案 0 :(得分:3)

这就是依赖注入的样子。您正在测试AdmissionMngr,但要确保您不测试该经理使用的IAWClient,您可以创建模拟IAWClient实施(使用模拟框架)并通过它作为对象构造函数的依赖。

关于您发布的代码:

第一个实际测试模拟对象,因此它没有意义。第二个测试AdmissionMngr,其依赖性被模拟,这在单元测试中是非常常见的做法。

答案 1 :(得分:2)

你的嘲讽存在注入其他测试案例。你不会测试你的嘲笑......他们总会产生你告诉他们制作的东西(你的第一个例子就是这样)。

当你嘲笑某事时 - 它没有受到考验。您可以使用mock来测试需要该类型的对象才能运行的其他东西。你可以让它提供一些预期的输入,但另一个对象应该根据它产生一些预期的输出。

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