10

コンストラクターにコレクション引数が必要な抽象クラスがあります。クラスをモックしてテストするにはどうすればよいですか?

public abstract class QuoteCollection<T> : IEnumerable<T>
        where T : IDate
    {
        public QuoteCollection(IEnumerable<T> quotes)
        {
            //...
        }

        public DateTime From { get { ... } }

        public DateTime To { get { ... } }
    }

コレクションからコンストラクターに渡される各アイテムは、以下を実装する必要があります。

public interface IDate
{
    DateTime Date { get; }
}

カスタムモックを作成すると、次のようになります。

public class QuoteCollectionMock : QuoteCollection<SomeIDateType>
{
    public QuoteCollectionMock(IEnumerable<SomeIDateType> quotes) : base(quotes) { }
}

Moqでこれを達成できますか?

4

1 に答える 1

20

あなたは次の線に沿って何かをすることができます:

var myQuotes = GetYourQuotesIEnumerableFromSomewhere();
// the mock constructor gets the arguments for your classes' ctor
var quoteCollectionMock = new Mock<QuoteCollection<YourIDate>>(MockBehavior.Loose, myQuotes); 

// .. setup quoteCollectionMock and assert as you please ..

非常に簡単な例を次に示します。

public abstract class AbstractClass
{
    protected AbstractClass(int i)
    {
        this.Prop = i;
    }
    public int Prop { get; set; }
}
// ...
    [Fact]
    public void Test()
    {
        var ac = new Mock<AbstractClass>(MockBehavior.Loose, 10);
        Assert.Equal(ac.Object.Prop, 10);
    }
于 2012-10-06T13:30:35.747 に答える