[英]mock.Setup(…).Returns(..); Not mocking
我正在運行 WCF 應用程序,需要添加一些單元測試。 最初我嘗試了 JustMock,免費版本,因為這是我目前所在公司的標准,但是免費版本不support system.linq.xml
所以,我搬到了最小起訂量,並認為這會起作用,但是下面的代碼塊
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;
}
我看不出我錯過了什么,如果有人能幫助我推進這個問題,我將不勝感激。
謝謝
設置看起來基本沒問題。 我懷疑您的問題是由於參數相等,根本沒有調用設置。
mock.Setup(VersionFilter => VersionFilter.ParseMessage(message)).Returns(returnValue);
這就是說ParseMessage
用等於message
的東西調用將返回returnValue
。 如果Message
是 class 這只有在Message
實現它自己的Equals
方法時才有效。
正如我的 OP 評論中提到的,從基礎開始。 確保首先調用設置:
mock.Setup(VersionFilter => VersionFilter.ParseMessage(It.IsAny<Message>())).Returns(returnValue);
一旦你得到這個工作,調整它以適應測試用例。 您可以為Message
類型實現Equals
方法(如果您願意,我建議使用 Fody),或者通過It.Is<Message>(message => match conditions)
以另一種方式匹配它。
您已使用此行創建了IVersionFilter
的模擬
Mock<IVersionFilter> mock = new Mock<IVersionFilter>();
但我希望看到一個IVersionFilter
在其構造函數中采用 IVersionFilter。 然后你會做
var myTestClass = new TestClass(mock.Object)
然后,當測試IVersionFilter
使用 IVersionFilter 中的功能時,它使用模擬的功能
澄清一下,TestClass 類似於
public class TestClass(IVersionFilter filter)
{
public void DoSomething()
{
filter.DoSomething();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.