2009-01-30 54 views
5

現在我已經寫了一段時間我的域對象的測試,但我還是不太清楚如何去測試安全在我的web項目。某些環境中的某些用戶可以訪問我的模型的某些屬性等,但是您將如何去測試它?現在,我基於當前的身份驗證用戶,但我將如何去注入一個虛假的身份驗證提供程序?你如何測試你的ASP MVC應用程序的基於用戶的安全性?

這可能是一個愚蠢的問題,但如果有人可以幫助我走出測試黑暗時代,那將是非常讚賞。

+0

重複:http://stackoverflow.com/questions/243851/programmatic-login-with-net-membership -provider not.that.dave.foley的解決方案將爲您工作。 – 2009-01-30 18:02:51

回答

8

這種聯繫是一種方式,但它是更好的使用模擬:

Mock<ControllerContext> MockContext(string userName) 
    { 
     var mockContext = new Mock<ControllerContext>(); 
     // mock an authenticated user 
     mockContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName); 
     mockContext.SetupGet(p => p.HttpContext.User.Identity.IsAuthenticated).Returns(true); 
     return mockContext; 
    } 

    [TestMethod] 
    public void DinnersController_Delete_Should_Fail_With_InvalidOwner_Given_Wrong_User() 
    { 
     //set by default 
     var mockContext = MockContext("scottha"); 

     // mock an authenticated user 
     _dinnerController.ControllerContext = mockContext.Object; 

     ViewResult result = _dinnerController.Delete(1, "") as ViewResult; 
     Assert.AreEqual("InvalidOwner", result.ViewName); 
    } 
0

如果使用TDD的測試應該只測試代碼有問題,其他所有關聯的對象應該是嘲笑/僞造

等等,你需要一個模擬的安全供應商,可以模擬你需要給用戶的情況下,測試(來賓,用戶1,用戶2,管理員等)

當你與當前MVC RC空白MVC項目你用模擬的安全提供者(會員/角色等)的基本測試框架。他們需要一些充實了,但給的基本設計

0

還有第三種選擇,那就是使用Xania.AspNet.Simulator

首先準備控制器動作

// arrange 
var controllerAction = new AccountController().Action(c => c.ChangePassword()) 
    .Authenticate(<username>, <roles>); 

下次你有這取決於您的實現兩個選項,

第一個場景,如果你返回HttpUnauthorizedResult,使用授權屬性,或當你重寫你的控制器的AuthorizeCore,那麼你可以測試它像以下,在這種情況下,則不會調用實際的操作方法時,即。

// act, assert 
controllerAction.Authorize().Should().BeNull(); 

第二種情況是當你真正驗證操作方法裏面的用戶:

// act 
var result = controllerAction.Execute(); 
// assert 
result.ActionResult.Should().NotBeOfType<HttpUnauthorizedResult>(); 
相關問題