我正在运行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;
}
我看不到我错过的一切,如果有人可以帮助我进一步解决这个问题,将不胜感激。
谢谢
答案 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)
进行另一种匹配。