试图在Nunit中实现接口模拟的问题

时间:2013-01-31 01:03:01

标签: c# .net mocking nunit moq

我花了很多时间试图找出这个问题,但到目前为止还没有运气。我正在尝试在以下

上实施模拟测试

我有两个接口的服务。一种是接收电子邮件/推文消息,另一种是回复它们。这些接口记录需要断言的信息。但到目前为止我的问题是如何正确地模拟两个接口。以下是详细信息。

   [ServiceContract]
   Name=emailsystem
   callabackcont=typeof(Iemailcallback)
   Public Interface IemailReceived
   [OperationContract]
   Void EmailReceived(EmailResponse message, int messgID)



    //Than in my DataContract I have 
    [DataContract(Name=EmailRequest...]

     public EmailReceived(Email message, int mssgID)
     {

     }




    //for my response interfact Iemailcallback I have 
    [ServiceContract(Name= "xyz")]

    [OperationContract] (IsOneWay=true   )
    void EmailResponse(emailResponse)

     //for the above interface I have data contract 
     [DataContract]
     EmailResponse 
     this(status, mssg)

我正在尝试使用NUnit中的Moq模拟测试EmailResponse和EmailRequest。我尝试了不同的方法,但没有任何作用。我创造了模拟

   var mockEmailRequest = new Mock<IEMailRequest>
   var mockEmailResponse = new Mock<Iemailcallback>

since I dont have return type on the methods so I guess it goes something like in setup


    mockEmailResponse.setup(x+>x.EmailResponse).Callback(.....);

不确定如何实施。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以模拟界面,但如果返回类型为void,您将无法测试输出/功能。

如果要修改正在发送的对象,则可以检查该对象。否则它就是一个黑盒子。

也许您应该做的是在测试套件中实现接口以及EmailResponse和EmailReceived的方法体,只需将参数打印到控制台即可。

例如:


public class EmailTestImplemtation : IEmailReceived {
   void EmailReceived(EmailResponse message, int messgID) {
      Console.out.WriteLine("Message: " + message.toString() + " MessageID: " + messgID);
   }
}

这是无用的,因为它证明了你的参数在代码的其他部分正确传递。

当你得到依赖项时,你可以模拟一个接口,但你不能真正单元测试依赖项。换句话说,您不对实时数据库运行单元测试。您模拟了数据库顶部使用的接口,但是运行存储过程/查询的实际函数......您将其留给集成测试,而不是单元测试。

答案 1 :(得分:0)

您需要在模拟上使用Verify函数。有几种方法可以做到这一点。

//when you know the parameter values to expect
mockEmailRequest.Verify(r=>r.EmailReceived(expectedEmail, expectedId));

//when you just want to verify some detail about the values
mockEmailRequest.Verify(r=>r.EmailReceived(It.Is<EmailResponse>(r=>r.Subject == "Something"), It.Is<int>(i=>i > 17)));

//when you don't care about the values
mockEmailRequest.Verify(r=>r.EmailReceived(It.IsAny<EmailResponse>(), It.IsAny<int>()));

Moq Quick Start page了解详情。