我正在尝试模拟Visual Studio CommandBars实例.CommandBars实现非通用的IEnumerable接口.为了能够迭代模拟,我设置了GetEnumerable().奇怪的是,这只有在我将mock.Object作为CommandBars的一个实例访问时才有效.如果我转换为IEnumerable(因为它在使用Linq方法时隐式发生),GetEnumerable()突然返回null.有人可以解释这种行为吗?
var mockCommandBars = new Mock<CommandBars>();
IEnumerable bars = new List<CommandBar>();
mockCommandBars.Setup(cb => cb.GetEnumerator()).Returns(bars.GetEnumerator);
var cbs = mockCommandBars.Object;
var cbs1 = cbs.GetEnumerator(); // returns instance
var ecbs = (IEnumerable) cbs;
var cbs2 = ecbs.GetEnumerator(); // returns null!
Run Code Online (Sandbox Code Playgroud)
编辑:我正在使用Moq 4.2.1402.2112
我开始在我的项目中使用Ninject来自动绑定抽象类的所有子类.对此的绑定是 - 简单易行 - 如下:
kernel.Bind(x => x.FromThisAssembly()
.SelectAllClasses().
.InheritedFrom<AbstractGenerator>()
.BindBase());
Run Code Online (Sandbox Code Playgroud)
但是,我发现这不起作用.经过一些实验,我发现这不起作用的原因是我的所有实现(和抽象类)都标记为内部.
我可以想象这是一些安全功能,以防止绑定从内部泄漏到外部.但我可以为这些类添加显式绑定.因此,我的问题是:有人知道这是否是预期的行为?有没有办法解决这个问题,除了让我的所有课程都公开?