繁体   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