0

メソッドが呼び出されない理由を理解しようとして、私はかなり迷っています。問題を再現する小さなテスト コードを作成しました。

public interface ILoader
{
    IEnumerable<string> LoadAll();

    string LoadItem(int key);
}

public interface IStore
{
    IQueryable<string> Items { get; }
}

public abstract class StoreBase : IStore
{
    public void Load()
    {
        Items = LoadItems().ToArray().AsQueryable();
    }

    protected abstract IEnumerable<string> LoadItems();

    public IQueryable<string> Items { get; private set; }
}

public abstract class StoreBase2 : StoreBase
{
    private readonly ILoader _loader;

    protected StoreBase2(ILoader loader)
    {
        _loader = loader;
    }

    protected override IEnumerable<string> LoadItems()
    {
        return _loader.LoadAll();
    }
}

テストの本文はここまでです

Mock<ILoader> mockLoader = new Mock<ILoader>();
mockLoader.Setup(p => p.LoadAll()).Returns(() => Enumerable.Range(1, 10).Select(i => string.Format("Item: {0}", i)));
mockLoader.Setup(p => p.LoadItem(It.IsAny<int>())).Returns((int i) => string.Format("Item: {0}", i));

Mock<StoreBase2> mockStore = new Mock<StoreBase2>(mockLoader.Object);
mockStore.Object.Load();

mockLoader.Verify(p => p.LoadAll());

StoreBase2 の具体的な実装を導入し (命名については申し訳ありません)、基本クラスをモックする代わりにそれを使用すると、機能します。

public class StoreBaseImpl : StoreBase2
{
    public StoreBaseImpl(ILoader loader) : base(loader) {}
}

void MyTest() 
{
    Mock<ILoader> mockLoader = new Mock<ILoader>();
    mockLoader.Setup(p => p.LoadAll()).Returns(() => Enumerable.Range(1, 10).Select(i => string.Format("Item: {0}", i)));
    mockLoader.Setup(p => p.LoadItem(It.IsAny<int>())).Returns((int i) => string.Format("Item: {0}", i));

    var store = new StoreBaseImpl(mockLoader.Object);
    store.Load();
    mockLoader.Verify(p => p.LoadAll());
}   

何か不足していますか?

編集:コードに簡単にアクセスできるように貼り付けビンに追加: http://pastebin.com/ggV20wAw

4

3 に答える 3

2

ストア モックの基本クラスへの呼び出しをオンにします。

var mockStore = new Mock<StoreBase2>(mockLoader.Object) { CallBase = true };

このオプションは、メンバーの期待値を設定していない場合に、基本メンバーの仮想実装が呼び出されるかどうかを定義します。したがって、保護されたメンバーの期待値を設定することはできません。このオプションをオンにするだけで、LoadItems()のメソッドが呼び出されますStoreBase2。それ以外_loader.LoadAll()は実行されません。

于 2012-10-19T12:53:47.203 に答える
0

モック Load(..) メソッドをセットアップしていません。

于 2012-10-19T12:05:32.677 に答える
0

次のように .Setups() を検証可能にする必要があると思います。

mockLoader.Setup(p => p.LoadAll()).Returns("Blah").Verifiable();
mockLoader.Setup(p => p.LoadItem(It.IsAny<int>())).Returns("Blah").Verifiable();
于 2012-10-19T12:09:02.300 に答える