[英]how to mock.SingleOrDefault() with Moq and C#
我已經看到了一些像這樣的問題,但我正在尋找如何解決這個問題的一個很好的解釋。 我知道 Moq 不能模擬擴展調用,但我只是在尋找一個非常好的例子。 在當前的代碼中,我有一個像
var thing = listOfthings.myList.SingleOrDefault(lt => lt.Name== "NameToFind");
我試過了
MockedlistOfThings.Setup(x => x.myList.SingleOrDefault(o => o.Name == "NameToFind")).Returns(fakeObject);
只是在尋找一個好的工作。 謝謝。
為了進一步詳細說明這種情況是如何發生的,我們目前正在針對大量數據運行翻譯引擎,必須逐行運行。 這個翻譯引擎傳入一個名為 IListOfthings 的接口。 listOfthings 實際上將參考數據保存在一個字典中,該字典在程序中更高的另一個調用中預加載。 我創建了一個“fakeObject”<- 字典,其中包含該方法可以使用的假數據。 我模擬了傳遞給調用方法的 IlistOfthings。 但我不知道如何偽造 SingleOrDefault 調用。 簡化方法如下。
Public class ClassIMTesting
{
public void Translate(myObject obj, IlistOfThings listOfthings){
var thing = listOfthings.MyList.SingleOrDefault(lt => lt.Name== "NameToFind");
//Other logic here .....
}
}
public class Thing()
{
public string Name { get; set; }
public Dictionary MyDict { get; set; }
}
[TestFixture()]
public class MyCodeTest
{
MyObject myObj;
Mock<IListOfthings> listOfThings;
Thing thing;
[SetUp]
public void Setup()
{
myObj = new MyObject();
_thing = new thing();
_thing.Name = "MyName";
var myDict = new Dictionary<string, string>();
myDict.Add("70,~", "");
myDict.Add("70,145", "expectedResult");
myDict.Add("911,", "expectedResult");
thing.MyDict = myDict;
listOfThings = new Mock<IListOfthings>();
listOfThings.Setup(x => x.MyList.SingleOrDefault(o => o.Name == "MyName")).Returns(thing);
}
[TestCase("70", "~", "70070")]
[TestCase("70", "145", "expectedResult")]
[TestCase("911", "", "expectedResult")]
public void TranslateTest(string iTC, string ITCode, string expectedResult)
{
myObject.ITC = iTC;
myObject.ITCode = iTCode;
ClassIMTesting p = new ClassIMTesting();
p.Translate(myObject, listofThings.Object);
Assert.That(myObject.ITC3Code, Is.EqualTo(expectedResult));
}
}
public interface IListOfThings
{
List<Thing> MyList{ get; set; }
}
給定的
public interface IListOfThings {
List<Thing> MyList { get; set; }
}
public class Thing() {
public string Name { get; set; }
public Dictionary MyDict { get; set; }
}
為了提供一個mock來滿足下面的例子
public class ClassImTesting {
public Thing Translate(IlistOfThings listOfthings){
var thing = listOfthings.MyList.SingleOrDefault(lt => lt.Name== "NameToFind");
return thing
}
}
模擬只需要返回一個集合,該集合將允許SingleOrDefault
擴展在調用時按預期運行。
例如
//Arrrange
Mock<IListOfthings> listOfThings = new Mock<IListOfthings>();
var thing = new Thing {
Name = "NameToFind",
//...
};
List<Thing> list = new List<Thing>() { thing };
listOfThings.Setup(_ => _.MyList).Returns(list);
var subject = new ClassImTesting();
//Act
var actual = subject.Translate(listOfThings.Object);
//Assert
Assert.That(actual, Is.EqualTo(thing));
通過讓模擬返回一個實際的List<Thing>
,當
var thing = listOfthings.MyList.SingleOrDefault(lt => lt.Name== "NameToFind");
被調用時, SingleOrDefault
擴展作用於一個列表,我可以在其中按預期行事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.