2017-02-22 8 views
1

У меня есть этот интерфейс:Как издеваются интерфейс, которые принимают аргумент типа и вернуть еще один inteface

public interface IViewModelCache 
{ 
    IViewModel GetViewModel(Type viewModelType); 
} 

И я насмешливый его с этим кодом:

var cacheMock = Mock.Of<IViewModelCache>(); 

Mock.Get(cacheMock) 
    .Setup(cache => cacheMock.GetViewModel(typeof(IViewModel))) 
    .Returns(Mock.Of<IViewModel>()); 

Но он бросает

«Указанный способ не поддерживается».,

что не так?

Стек трассировки:

на Moq.Mock.FluentMockVisitor.VisitMember (MemberExpression узел)
в Moq.Mock.FluentMockVisitor.Accept() в Moq.Mock.FluentMockVisitor.Accept (Expression выражение, Mock mock)
at Moq.Mock.GetInterceptor (Expression fluentExpression, Mock mock)
at Moq.Mock. <> c__DisplayClass65_0 2.<Setup>b__0() at Moq.PexProtector.Invoke[T](Func 1 функция) при Moq.Mock.Setup [T, TResult] (Тестовая модель 1 1 mock, Expression выражение, Состояние состояние) при Moq.Mock выражение)

Я также попытался что:

Mock.Get(cacheMock) 
    .Setup(cache => cacheMock.GetViewModel(It.IsAny<Type>())) 
    .Returns(Mock.Of<IViewModel>()); 

И один:

Mock.Get(cacheMock) 
    .Setup(cache => cacheMock.GetViewModel(It.IsAny<Type>())) 
    .Returns(new Mock<IViewModel>().Object); 

И т вызывает одно и то же исключение.

+0

Вы можете разместить стек вызовов, за исключением? –

+0

@PatrickQuirk, я разместил его в вопросе –

ответ

2

Выражение в настройках неправильно. Попробуйте сделать код чистым, чтобы понять намерение.

var cache = Mock.Of<IViewModelCache>(); 
var viewModel = Mock.Of<IViewModel>(); 
var viewModelType = typeof(IViewModel); 

Mock.Get(cache) 
    .Setup(mock => mock.GetViewModel(viewModelType)) 
    .Returns(viewModel); 
1

Вы должны вернуть объект макета вместо самого макета.

Returns(Mock.Of<IViewModel>()) 

должен быть

Returns(new Mock<IViewModel>().Object) 

Update

Попробуйте

var cacheMock = new Mock<IViewModelCache>(); 
cacheMock.Setup(c => c.GetViewModel(typeof(IViewModel))) 
     .Returns(new Mock<IViewModel>().Object); 
+0

Mock.Get (cacheMock) .Setup (cache => cacheMock.GetViewModel (It.IsAny ())). Возвращает (новый Mock () .Object); Также выбрасывает одно и то же исключение –

0

У вас есть опечатка:

Mock.Get(cacheMock) 
    .Setup(cache => cacheMock.GetViewModel(typeof(IViewModel))) 
    .Returns(Mock.Of<IViewModel>()); 

должно быть (обратите внимание на Setup вызов):

Mock.Get(cacheMock) 
    .Setup(cache => cache.GetViewModel(typeof(IViewModel))) 
    .Returns(Mock.Of<IViewModel>()); 
0

Наконец, что работал:

public static IViewModelCache MockViewModelCache() 
{ 
    var cache = Mock.Of<IViewModelCache>(); 
    var viewModel = Mock.Of<RoutableViewModelBase<IReportData>>(); 

    Mock.Get(cache) 
     .Setup(mock => mock.GetViewModel(It.IsAny<Type>))) 
     .Returns(viewModel); 

    return cache; 
} 
Смежные вопросы