3

我有一个名为“CollectionPager”的类,其中有一个 List 类型的集合。我有一个方法“RetrieveList”,它将“CollectionPager”作为输入并在其中填充“List”。此方法不返回任何值。

我需要模拟一个调用“RetrieveList”的函数。但是,由于它不返回任何值,因此不会考虑输入到 Mock 中的任何输入,并且此集合(列表)的计数始终为 0。

有什么可能的方法来解决这个问题?

4

1 回答 1

3

我想您需要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
    }
}
于 2012-09-13T16:41:58.377 回答