Невозможно смоделировать RegionManager.ActiveViews.First () - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь написать UT и застрял в строке ниже.

Код продукта (который создает проблему):

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

Unit Test (Соответствующий код):

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

1 Ответ

1 голос
/ 18 июня 2020

Вы должны удалить sh макет для 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
}
...