模拟。设置(...)。返回(..);不嘲笑

时间:2020-07-20 08:30:44

标签: c# .net moq

我正在运行WCF应用程序,需要添加一些单元测试。最初,我尝试了JustMock的免费版本,因为这是我目前所在公司的标准,但是免费版本并不support system.linq.xml

因此,我移至Moq并认为可以,但是下面的代码块

Mock<IVersionFilter> mock = new Mock<IVersionFilter>();
var message = CreateValidGetProposalListMessage();
var returnValue = XDocument.Parse(GenerateXmlString());
mock.Setup(VersionFilter => VersionFilter.ParseMessage(message)).Returns(returnValue);

应该从该调用中模拟ParseMessage(...)的结果

public override bool Match(Message message)
{
     var doc = ParseMessage(message);

     var getProposalList = doc.Descendants(_xmlnsa + MethodConstants.GetProposalList).FirstOrDefault();
     if (getProposalList != null)
     {
        // code ommitted
     }
     /// Test code ommitted
}

public XDocument ParseMessage(Message message)
{
     XDocument doc = XDocument.Parse(message.ToString());
     return doc;
}

public Message CreateValidGetProposalListMessage()
{
    var p = new getProposalList
    {
        Code = "xxxx"
    };

    var message = Message.CreateMessage(MessageVersion.Soap11, "getProposalList xmlns=\"http://xxx\">", p);

    return message;
}

我看不到我错过的一切,如果有人可以帮助我进一步解决这个问题,将不胜感激。

谢谢

2 个答案:

答案 0 :(得分:0)

您已经在此行创建了IVersionFilter的模拟

Mock<IVersionFilter> mock = new Mock<IVersionFilter>();

但是我希望看到一个在其构造函数中使用IVersionFilter的类。然后你会做

 var myTestClass = new TestClass(mock.Object)

然后,当测试类使用IVersionFilter中的功能时,它将使用模拟的功能

只需澄清一下,TestClass就像

public class TestClass(IVersionFilter filter)
{
     public void DoSomething()
     {
         filter.DoSomething();
     }
}

答案 1 :(得分:0)

设置看起来基本上没问题。我怀疑您的问题是因为参数相等而根本没有调用安装程序。

mock.Setup(VersionFilter => VersionFilter.ParseMessage(message)).Returns(returnValue);

这就是说ParseMessage被等于message的东西调用将返回returnValue。如果Message是一个类,则只有在Message实现其自己的Equals方法的情况下,此方法才能起作用。

正如我在OP评论中提到的,从基础开始。确保首先调用设置:

mock.Setup(VersionFilter => VersionFilter.ParseMessage(It.IsAny<Message>())).Returns(returnValue);

一旦您可以使用,请对其进行调整以适合测试用例。您可以为Equals类型实现Message方法(如果需要,建议使用Fody),也可以通过It.Is<Message>(message => match conditions)进行另一种匹配。