2014-12-09 2 views
3

У меня есть эта странная проблема при попытке подделать интерфейс с помощью MockedClass.Setup (x => x.Method()).Невозможно Mock интерфейс метода, когда параметр MultipartFormDataStreamProvider

Это интерфейс, который я издеваюсь.

public interface IClassFactory 
{ 
    object GetValueFromFormData(string key, MultipartFormDataStreamProvider provider); 
} 

Это мой тест.

[TestMethod] 
    [ExpectedException(typeof(NullReferenceException))] 
    public async Task ClassApiController_ImportClassList_ThrowsNullReferenceExceptionWhenNoClassId() 
    { 
     // Arrange 
     _classFactory = new Mock<IClassFactory>(); 

     // THIS IS THE LINE THAT GIVES AN EXCEPTION 
     _classFactory.Setup(x => x.GetValueFromFormData("classIdNull", null)).Returns(string.Empty); 
     ClassApiController controller = new ClassApiController(_classRepository.Object, _surveyRepository.Object, _classFactory.Object); 

     // Act 
     string result = await controller.ImportClassList(); 
    } 

Если вы посмотрите на мой комментарий «это линия, которая дает ИСКЛЮЧЕНИЕ», которую вы видите, я отправить пустой, но это не имеет значения, если я посылаю MultipartFormDataStreamProvider как instansiated класса, а я до сих пор получаю такое же исключение.

Exception message: System.ArgumentException: Expression of type 'System.Net.Http.MultipartFormDataStreamProvider' cannot be used for parameter of type 'System.Net.Http.MultipartFormDataStreamProvider' of method 'System.Object GetValueFromFormData(System.String, System.Net.Http.MultipartFormDataStreamProvider)' 

Если вы знаете, почему я не могу издеваться метод только потому, что он имеет этот объект в качестве параметра, пожалуйста, помогите мне, я невежествен.

Спасибо!

EDIT: См решение в моем ответе

+0

Вы пытались изменить тип на 'IMultipartStreamProvider' в методе GetValueFromFormData? –

ответ

1

С помощью @ Vignesh.N я наконец-то решил. Простой ответ в этом случае заключался в том, что мое решение разделено на несколько проектов. Web, Test, Data и т. Д. В веб-проекте я ссылался на веб-сайт api .dll: s через Nuget, и в тестовом проекте я ссылался на них напрямую через Add references -> Assemblies -> Framework. Таким образом, файлы .dll: s имели идентичные версии, но не файлы. После того, как Nuget позаботится обо всех проектах web api .dll, он работал мгновенно.

В общем, глупая ошибка и трудно обнаружить.

1

вы должны попробовать

 _classFactory = Mock.Of<IClassFactory>(); 

     Mock.Get(_classFactory).Setup(x => x.GetValueFromFormData("classIdNull", It.IsAny<MultipartStreamProvider>())) 
        .Returns(string.Empty); 
+0

Привет, это _classFactory IClassFactory или что-то еще? Потому что вы не можете сделать. Установить непосредственно на интерфейс ... – Andreas

+0

Я отредактировал ответ .. :) –

+0

Спасибо, следующий вопрос :) IMultipartStreamProvider, откуда вы получаете этот интерфейс? Как я вижу, MultipartFormDataStreamProvider наследует от абстрактного класса в конце? – Andreas

Смежные вопросы