我有一个名为“CollectionPager”的类,其中有一个 List 类型的集合。我有一个方法“RetrieveList”,它将“CollectionPager”作为输入并在其中填充“List”。此方法不返回任何值。
我需要模拟一个调用“RetrieveList”的函数。但是,由于它不返回任何值,因此不会考虑输入到 Mock 中的任何输入,并且此集合(列表)的计数始终为 0。
有什么可能的方法来解决这个问题?
我有一个名为“CollectionPager”的类,其中有一个 List 类型的集合。我有一个方法“RetrieveList”,它将“CollectionPager”作为输入并在其中填充“List”。此方法不返回任何值。
我需要模拟一个调用“RetrieveList”的函数。但是,由于它不返回任何值,因此不会考虑输入到 Mock 中的任何输入,并且此集合(列表)的计数始终为 0。
有什么可能的方法来解决这个问题?
我想您需要Callback
(另请参阅Moq quickstart)方法来设置一些逻辑来模拟一个 void 函数。
这是演示用法的示例测试:
var mock = new Mock<IRetrieveListService>();
mock.Setup(m => m.RetrieveList(It.IsAny<CollectionPager>()))
.Callback<CollectionPager>(p =>
{
p.List.Add("testItem1");
p.List.Add("testItem2");
});
var sut = new OtherService(mock.Object);
sut.SomeMethodToTest();
假设您的课程看起来像这样:
public class CollectionPager
{
public CollectionPager()
{
List = new List<string>();
}
public List<string> List { get; private set; }
}
public interface IRetrieveListService
{
void RetrieveList(CollectionPager pager);
}
public class RetrieveListService : IRetrieveListService
{
public void RetrieveList(CollectionPager pager)
{
pager.List.Add("item1");
pager.List.Add("item2");
}
}
public class OtherService
{
private readonly IRetrieveListService retrieveListService;
public OtherService(IRetrieveListService retrieveListService)
{
this.retrieveListService = retrieveListService;
}
public void SomeMethodToTest()
{
var collectionPager = new CollectionPager();
retrieveListService.RetrieveList(collectionPager);
// in your test collectionPager.Item contains: testItem1, testItem2
}
}