代码之家  ›  专栏  ›  技术社区  ›  Simon Price

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

  •  0
  • Simon Price  · 技术社区  · 4 年前

    我正在运行一个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;
    }
    

    我看不出我错过了什么,如果有人能帮我解决这个问题,我将不胜感激。

    1 回复  |  直到 4 年前
        1
  •  0
  •   rgvlee    4 年前

    安装看起来基本正常。我怀疑您的问题是,由于参数相等,根本没有调用安装程序。

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

    这是在说 ParseMessage 用等于 message returnValue Message 是一个只有在 消息 实现它自己的 Equals

    正如我在评论中提到的,从基础开始。请确保先调用安装程序:

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

    等于 方法 消息 类型(如果你想这样的话,我建议是Fody),或者用另一种方式匹配它 It.Is<Message>(message => match conditions)

        2
  •  0
  •   Lotok    4 年前

    您创建了一个 IVersionFilter 用这条线

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

    电磁滤波器 在其构造函数中。然后你就可以了

     var myTestClass = new TestClass(mock.Object)
    

    那么当测试类使用 电磁滤波器 它用的是被嘲笑的那个

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