2014-09-03 112 views
18

我正在嘗試使用Moq創建單元測試,該測試測試MongoDB.AspNet.Identity V2提供程序。這條線給我的悲傷:無法實例化代理...找不到無參數構造函數

var appUser = new Mock<PreRegistrationMVC.Models.ApplicationUser>(); 
var userStore = new Mock<MongoDB.AspNet.Identity.UserStore<PreRegistrationMVC.Models.ApplicationUser>>(); 

看來userStore不會正確實例化這裏是錯誤。

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException was unhandled by user code 
    HResult=-2147024809 
    Message=Can not instantiate proxy of class: MongoDB.AspNet.Identity.UserStore`1[[MVC.Models.ApplicationUser, MVC, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. 
Could not find a parameterless constructor. 
    Source=Moq 
    StackTrace: 
     at Castle.DynamicProxy.ProxyGenerator.CreateClassProxyInstance(Type proxyType, List`1 proxyArguments, Type classToProxy, Object[] constructorArguments) 
     at Castle.DynamicProxy.ProxyGenerator.CreateClassProxy(Type classToProxy, Type[] additionalInterfacesToProxy, ProxyGenerationOptions options, Object[] constructorArguments, IInterceptor[] interceptors) 
     at Moq.Proxy.CastleProxyFactory.CreateProxy(Type mockType, ICallInterceptor interceptor, Type[] interfaces, Object[] arguments) 
     at Moq.Mock`1.<InitializeInstance>b__2() 
     at Moq.PexProtector.Invoke(Action action) 
     at Moq.Mock`1.InitializeInstance() 
     at Moq.Mock`1.OnGetObject() 
     at Moq.Mock.GetObject() 
     at Moq.Mock.get_Object() 
     at Moq.Mock`1.get_Object() 
     at MVC_Tests.Identity.Accounts.AccountController_Test.TestSuccessfulRegister() in c:\Users\Tim\Documents\Visual Studio 2013\Projects\PreRegistrationApp\MVC_Tests\Identity\Accounts\AccountController_Test.cs:line 108 
    InnerException: 

我完全新的起訂量,所以我在尋找: 需要什麼類型的設置,起訂量來實例化呢?有沒有關於Moq不能很好地發揮作用的UserStore類?

感謝您的閱讀。

回答

24

MOQ適用於模擬接口,但對具體類不適用。因此,而不是嘲笑具體類,索要inteface:

var userStore = new Mock<IUserStore<PreRegistrationMVC.Models.ApplicationUser>>(); 

而且ApplicationUser應該是POCO,所以沒必要嘲笑它,只是沒有MOQ創建它的實例和測試使用。

+0

哦,這工作!謝謝! :) – ChiliYago 2014-09-03 16:51:46

+0

偉大的工作。還有一件事你可以指導我做什麼,我應該模仿。例如,我正在使用一些層架構,我只想測試一個層,我想測試它的層也有一些其他層依賴。那麼你應該建議什麼? – Naveen 2016-06-17 13:48:45

+0

@Naveen你問的是一個非常廣泛的話題,評論不是討論的最佳地點。我的建議是閱讀一本關於單元測試的書 - Roy Osherove的書很好。他詳細介紹了你遇到的問題。 – trailmax 2016-06-17 14:20:01

3

我有這個問題。我寫了...

var x = new Mock<Concrete>(); 

...而不是...

var x = new Mock<IConcrete>(); 
4

你可以試試指仿製品的行爲,如下圖所示

Mock<testClass>(MockBehavior.Strict, new object[] {"Hello"}); 
+4

因爲它是params參數,它可以寫成更短的新模擬(MockBehavior.Strict,「Hello」);'' – sschoof 2017-02-07 13:39:07

相關問題