2013-07-19 89 views
2

所以我使用Moq並開始爲我的控制器動作編寫單元測試。問題單元測試一個繼承自定製基礎控制器的asp.net MVC控制器

我所有的控制器都繼承自一個基本的CustomController類,它在構造函數中提供了一個userId屬性集,以作爲Membership.GetUser()。ProviderUserKey的值。這樣我就可以簡單地通過傳遞contactId來傳遞userId到我的服務層。

這似乎並不與這個單元測試效果很好,

var serviceMock = new Mock<IFormService>(); 
     serviceMock.Setup(g => g.GetForm(2)).Returns(new FormViewModel() {ID = 2, Name = "Mock Form"}); 
     var controller = new FormController(serviceMock.Object); 
     var result = controller.Index(2); 
     Assert.IsNotNull(result, "View Result is null"); 

它輕視它試圖從Membership.GetUser()ProviderUserKey設置用戶標識的基礎CustomController例外。

「UnauthorizedAccessException:訪問路徑'C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ CommonExtensions \ Microsoft \ TestWindow \ App_Data'被拒絕。」

是否有其他人遇到過這個問題,或者有什麼想法繞過它?

+0

它可以幫助看到你的構造,但我的猜測是,你將需要注入模擬會員提供商,並配置DI容器根據請求使用生命週期。基本上,如果它是一個依賴項,它需要在構造器中,所以你可以在測試中控制它的行爲。見http://stackoverflow.com/questions/4193484/how-do-i-control-membershipprovider-instance-creation-lifetime – stuisme

回答

0

你也許忘記設置成員資格提供在webconfig:

<system.web> 
    <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20"> 
</system.web>