[英]Mocked object returning null object instead of List
使用Moq,我有一個模擬對象,它應該從函數調用返回List<>
。 返回的對象為null
,我不知道為什么。
在這里,我創建了模擬對象並設置函數以返回List
var mockParser = new Mock<ISalesParser>() { CallBase = false };
mockParser.Setup(m => m.Parse(It.IsAny<string>())).Returns(new List<ImportedData>{ new ImportedData{ ReportingPeriod = DateTime.Now } });
它是被測函數,我調用Parse()
並捕獲返回的對象。 當我嘗試獲取列表的Count
時,它會拋出一個System.ArgumentNullExcpetion : Value cannot be null
異常。
我很嘲笑和Moq,有什么我想念的嗎?
測試方法:
[Test]
public void Test_ImportNormalExecution()
{
var importedData = new Mock<List<ImportedData>>(MockBehavior.Strict) { CallBase = false };
importedData.SetupAllProperties();
importedData.As<IEnumerable<ImportedData>>().Setup(m => m.GetEnumerator()).Returns(importedList.GetEnumerator());
var mockParser = new Mock<ISalesParser>() { CallBase = false };
mockParser.Setup(m => m.Parse(It.IsAny<string>())).Returns(new List<ImportedData>{ new ImportedData{ ReportingPeriod = DateTime.Now } });
mockParser.Setup(m => m.Parse(It.IsAny<string>())).Callback(() => parseFuncCall++);
var mockContext = new Mock<ApplicationDbContext>() { CallBase = true };
mockContext.As<IUnitOfWork>().CallBase = false;
mockContext.Setup(m => m.ImportedData.Add(It.IsAny<ImportedData>())).Callback(() => addImportDataCall++);
unitOfWork = new UnitOfWork(mockContext.Object);
dataRepository = new ImportedDataRepository(mockContext.Object);
parser = mockParser.Object;
service = new SalesService(parser, dataRepository, unitOfWork);
string status = "Parsed input file. Processed imported data into sales history.";
SalesImportResults results = ((ISalesService)service).Import(AmazonHtmlSalesParserResources.AmazonHtmlDataValid);
Assert.AreEqual(1, results.Count);
Assert.That(parseFuncCall == 1);
Assert.That(addImportDataCall == 1);
Assert.That(String.Compare(status, results.Status) == 0);
}
正在測試的方法
public SalesImportResults ISalesService.Import(string data)
{
var salesImportResults = new SalesImportResults();
try
{
IEnumerable<ImportedData> sales = _salesParser.Parse(data);
salesImportResults.Count = sales.Count();
salesImportResults.Date = sales.FirstOrDefault().ReportingPeriod;
salesImportResults.Status = "Parsed input file.";
foreach (ImportedData salesItem in sales)
{
_importedDatarepository.Add(salesItem);
}
_unitOfWork.SaveChanges();
salesImportResults.Status += " Inserted data into import table.";
_importedDatarepository.ProcessImportedData();
salesImportResults.Status += " Processed imported data into sales history.";
return salesImportResults;
}
catch (Exception ex)
{
throw new ApplicationException(salesImportResults.Status + " - but then something went wrong: " + ex.Message, ex);
}
}
salesImportResults.Count = sales.Count();
行拋出異常salesImportResults.Count = sales.Count();
public interface ISalesParser
{
IEnumerable<ImportedData> Parse(string data);
}
你打電話時
mockParser.Setup(m => m.Parse(It.IsAny<string>())).Callback(() => parseFuncCall++);
先前配置的返回值被重置,因此它再次為空。 如果您需要設置一個返回值和一個回調,您可以鏈接Returns
和Callback
方法一起使用:
var mockParser = new Mock<ISalesParser>() { CallBase = false };
mockParser.Setup(m => m.Parse(It.IsAny<string>()))
.Returns(new List<ImportedData>{ new ImportedData{ ReportingPeriod = DateTime.Now } })
.Callback(() => parseFuncCall++);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.