MOQ:设置一个方法,填充作为参数传递的对象内的集合

时间:2012-09-13 16:21:20

标签: c# unit-testing moq

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

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

有任何可能的解决方法吗?

1 个答案:

答案 0 :(得分:3)

我猜你在模拟void函数时需要Callback(参见Moq quickstart)方法来设置一些逻辑。

以下是演示用法的示例测试:

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
    }
}