簡體   English   中英

Asp.net MVC集成測試和websecurity

[英]Asp.net MVC integration test and websecurity

我正在開發一個ASP.Net MVC 4網站,我想測試它。 在我想測試的控制器中,我打電話

WebSecurity.CreateUserAndAccount

我有一些關於這個電話的邏輯,我想測試一下。 所以我測試了整個動作(將來,我將不得不多次這樣做)。

所以這是我的考驗

[TestMethod]
        public void RegisterUser()
        {
            // Arrange
            var controller = new UserController("TestConnection");

            // Act
            var user= new UserModel()
            {
                MailAddressTemp = "dummyuser@gmail.com",
                Password = "password",
                ConfirmPassword = "password",
                FirstName = "firstname",
                LastName = "lastname",
            };
            TestHelper.ValidateViewModel(user, controller);
            if (!controller.ModelState.IsValid)
                Assert.Inconclusive("Model should be valid!");
            controller.Register(user);
            using (var context = new PatientDbContext("TestConnection"))
            {
                var userProfile = context.UserProfiles.FirstOrDefault(x => x.MailAddress == "dummyuser@gmail.com");
                Assert.IsNotNull(userProfile);
                Assert.AreEqual("dummyuser@gmail.com", WebSecurity.CurrentUserName);
                Assert.IsTrue(WebSecurity.UserExists("dummyuser@gmail.com"));
                WebSecurity.Logout();
                var islogged = WebSecurity.Login("dummyuser@gmail.com", "password");
                Assert.IsTrue(islogged);
            }
        }

我的問題是,當我想使用時,我有一個例外

WebSecurity.CreateUserAndAccount

這是個例外

要調用此方法,“Membership.Provider”屬性必須是“ExtendedMembershipProvider”的實例

我將來需要在未來的測試中使用WebSecurity。 我來自WPF世界,在我的集成測試中,我能夠啟動一個應用程序容器並從單元測試解決方案中測試它。 在這里,看起來我運行測試時沒有啟動Web應用程序,我不知道該怎么做。

我的問題:

如何在我的測試解決方案中使用WebSecurity並解決異常?

如何啟動我的應用程序以便像在實時應用程序中一樣加載所有對象並從單元測試中的代碼測試我的操作?

我不想要瀏覽器。 我希望能夠做類似的事情

StartApp()
var result = MyController.Action(params)//My action uses WebSecurity for instance
Assert.IsTrue(something from result)

任何幫助都會有所幫助! 謝謝!

你最好圍繞WebSecurity類的靜態方法創建裝飾器。 您將能夠模擬它並隔離您的控制器核心。 例如:

public interface IWebSecurity
{
    bool CreateUserAndAccount(....);
}

public class MyWebSecurity: IWebSecurity
{
    public bool CreateUserAndAccount(...)
    {
        WebSecurity.CreateUserAndAccount(...);
    }
}

在您的測試代碼中,您將能夠做到(使用Moq測試框架):

var webSecurity=new Mock<IWebSecurity>();
var controller = new UserController("TestConnection", webSecurity.Object);

我在這里找到了部分解決方案。 我需要在我的測試解決方案的app.config中添加它

<system.web>
    <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
      <providers>
        <clear />
        <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData" />
      </providers>
    </roleManager>
    <membership defaultProvider="SimpleMembershipProvider">
      <providers>
        <clear />
        <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
      </providers>
    </membership>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
  </system.web>

在我的測試之前,我不得不打電話

    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "MailAddress", autoCreateTables: true);

您必須在測試項目中的引用中添加WebMatrix.webData和WebMtrix.Data,並將“Copy local”設置為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM