3

List型のコレクション内にコレクションを持つ「CollectionPager」という名前のクラスがあります。「CollectionPager」を入力として受け取り、その横に「List」を設定するメソッド「RetrieveList」があります。このメソッドは値を返しません。

「RetrieveList」を呼び出す関数をモックする必要があります。ただし、値を返さないため、Mockに入力された入力は考慮されず、このコレクション(リスト)のカウントは常に0になります。

これを解決するための可能な方法はありますか?

4

1 に答える 1

3

void関数をモックするときにロジックを設定するには( MoqクイックスタートCallbackも参照)メソッドが必要だと思います。

使用法を示すサンプルテストは次のとおりです。

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 に答える