0

我已经花了很长时间试图解决这个问题,但到目前为止还没有运气。我正在尝试在以下方面实施模拟测试

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

   [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。我尝试了不同的方法,但没有任何效果。我创建了 Mocks

   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(.....);

不知道如何实施。任何帮助将不胜感激。

4

2 回答 2

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>()));

在起订量快速启动页面上阅读更多相关信息。

于 2013-01-31T04:49:32.510 回答
0

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

如果您正在修改正在发送的对象,您可能会检查它。否则就是一个黑匣子。

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

例如:


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

不过这没什么用,因为它证明的只是您的参数在代码的其他部分中被正确传递。

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

于 2013-01-31T03:28:30.570 回答