我花了很多时间试图找出这个问题,但到目前为止还没有运气。我正在尝试在以下
上实施模拟测试我有两个接口的服务。一种是接收电子邮件/推文消息,另一种是回复它们。这些接口记录需要断言的信息。但到目前为止我的问题是如何正确地模拟两个接口。以下是详细信息。
[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(.....);
不确定如何实施。任何帮助将不胜感激。
答案 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了解详情。