2015-05-04 6 views
2

Я работаю с Shims и подделками в VS 2013 Premium. Когда Shimming из метода для всех экземпляров, я получаю ошибку «несовместимый метод и прокладку» во время выполнения. Компиляция не показывает никаких ошибок.Faking метод приводит к исключению «несовместимого метода и shim»

Код в вопросе:

ShimViewModelBase.AllInstances.GetQueryCriteriaFromUriNavigationContext = (T, C) => { return new List<QueryCriteria>(); }; 

Я ценю любое представление, которое может быть обеспечено.

В соответствии с запросом это определение метода, которое я пытаюсь отключить.

public List<QueryCriteria> GetQueryCriteriaFromUri(NavigationContext inContext); 

Полная Ошибка:

An exception of type 'System.ArgumentException' occurred in Microsoft.QualityTools.Testing.Fakes.dll but was not handled in user code 

Additional information: incompatible method and shim 

Стек след:

at Microsoft.QualityTools.Testing.Fakes.UnitTestIsolation.UnitTestIsolationRuntime.AttachDetour(Object optionalReceiver, MethodBase method, Delegate detourDelegate) 
    at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimMethod(Delegate optionalStub, Object optionalReceiver, MethodBase method) 
    at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShim(Delegate optionalStub, Type receiverType, Object optionalReceiver, String name, ShimBinding flags, Type returnType, Type[] parameterTypes) 
    at Microsoft.QualityTools.Testing.Fakes.Shims.ShimRuntime.SetShimPublicInstance(Delegate optionalStub, Type receiverType, Object optionalReceiver, String name, Type returnType, Type[] parameterTypes) 
    at Infrastructure.Fakes.ShimViewModelBase.AllInstances.set_GetQueryCriteriaFromUriNavigationContext(Func`3 value) 
    at MaterialTracking.UI.Module.Tests.NotificationsListViewModelTests.OnNavigatedToTest() in c:\CodeCoverage\Material Tracking\MaterialTracking.UI.UnitTests\Views\NotificationsListView\NotificationsListViewModelTests.cs:line 65 

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

ShimViewModelBase sBaseViewModel = new ShimViewModelBase((ViewModelBase)notificationsListViewModel); 
      sBaseViewModel.GetQueryCriteriaFromUriNavigationContext = (T) => { return new List<QueryCriteria>(); }; 
+0

Я отредактировал предоставленный код, чтобы включить то, что было запрошено – Adrien

+0

Не могли бы вы рассказать больше о классе 'ViewModelBase'? Это абстрактный класс? Внутренний класс? это из рамки? Является ли это обычным классом для вашего проекта? У вас есть минимальный проект, который показывает проблему? – jessehouwing

+0

ViewModelBase является частью структуры, которая была написана в моей компании. Это абстрактный класс. Он имеет базовый класс, а также реализует несколько интерфейсов. У меня нет минимального проекта, так как я не смог воспроизвести его в другом проекте без использования рамки. – Adrien

ответ

0

вы столкнулись с этой проблемой, потому что существует несоответствие между dll продукта и соответствующий fak es dll. Очень возможно, что в вашем коде продукта была изменена подпись функции «Открытый список GetQueryCriteriaFromUri (NavigationContext inContext)», но соответствующие фальшивые dll все еще старые. Создайте фальшивую dll, соответствующую обновленной DLL-продукту, и попробуйте запустить тест. Надеюсь, это поможет.

+0

Спасибо за указатель. Похоже, во время выполнения он вытаскивает другую версию класса из GAC, в то время как он использует локальную dll с обновленным классом во время компиляции. – Adrien