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