【问题标题】:Unable to Mock RegionManager.ActiveViews.First()无法模拟 RegionManager.ActiveViews.First()
【发布时间】:2020-06-18 08:05:26
【问题描述】:

我正在尝试编写 UT 并坚持以下行。

产品代码(造成问题):

var view = RegionManager.Regions["Dummy"].ActiveViews.First() as IView;

单元测试(相关代码):

var regionManagerMock = new Mock<IRegionManager>();
var viewCollMock = new Mock<IViewsCollection>();
regionManagerMock.Setup(c => c.Regions["Dummy"].ActiveViews).Returns(viewCollMock.Object);   

在执行这个 UT 时,我遇到了以下异常:

threw an exception of type 'System.NullReferenceException'
Data: {System.Collections.ListDictionaryInternal}
HResult: -2147467261
HelpLink: null
InnerException: null
Message: "Object reference not set to an instance of an object."
Source: "System.Core"
StackTrace: "   at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)"
TargetSite: {TSource First[TSource](System.Collections.Generic.IEnumerable`1[TSource])}

但是,我可以看到这个的价值

RegionManager.Regions["Dummy"].ActiveViews

在运行时:

{Mock<Prism.Regions.IViewsCollection:670c>.Object}
Mock: {Mock<Prism.Regions.IViewsCollection:670c>}
Mock (Castle.Proxies.IViewsCollectionProxy): {Mock<Prism.Regions.IViewsCollection:670c>}
__interceptors: {Castle.DynamicProxy.IInterceptor[1]}
__target: null
Results View: Expanding the Results View will enumerate the IEnumerable

【问题讨论】:

  • 您还需要创建 IView 的模拟。并为viewCollMock 添加如下设置:viewCollMock.Setup(c => c.First()).Returns(iViewMock.Object)

标签: c# unit-testing moq prism


【解决方案1】:

您必须充实模拟 First 才能使用它。

只是

var viewCollMock = new Mock<IViewsCollection>();

例如,将在所有地方返回Null。最简单的事情是创建一个常规的模拟:

internal class MyMockViewsCollection : IViewsCollection
{
    public ObservableCollection<object> Inner { get; } = new ObservableCollection<object>();

    #region IViewsCollection
    public event NotifyCollectionChangedEventHandler CollectionChanged
    {
        add => Inner.CollectionChanged += value;
        remove => Inner.CollectionChanged -= value;
    }
    public bool Contains( object value ) => Inner.Contains( value );

    public IEnumerator<object> GetEnumerator()
    {
        return Inner.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)Inner).GetEnumerator();
    }
    #endregion
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2020-09-11
    相关资源
    最近更新 更多