簡體   English   中英

如何在API控制器的單元測試中注冊我的System.Web.Security.Membership以避免此問題?

[英]How should register my System.Web.Security.Membership to avoid this issue in the unit test of an API controller?

我使用api控制器為用戶的日志創建了一個單元測試,並且成員身份正在使用此代碼行檢查Dto中的用戶。

  MembershipUser membershipUser = System.Web.Security.Membership.GetUser(Username);

在Web應用程序上,它運行良好,但是在測試項目和單元測試中,我遇到了此異常。

拒絕訪問路徑“ C:\\ PROGRAM FILES(X86)\\ MICROSOFT VISUAL STUDIO 12.0 \\ COMMON7 \\ IDE \\ COMMONEXTENSIONS \\ MICROSOFT \\ TESTWINDOW \\ App_Data”。

如何在單元測試中注冊System.Web.Security.Membership以避免此問題?

我的測試方法如下:

  [TestMethod]
  public void LoginSuccessfullyAnUser()
  {
      //Arrange
      var controller = new TokensController(unitOfWork, unitOfWorkMembership, configManager);
      var credentials = new LoginUserDTO
                             { 
                                 Username = "user1", 
                                 Password = "12345678" 
                              };

      controller.Request = new HttpRequestMessage 
      {
           RequestUri = new Uri("http://localhost/api/tokens")
      };

      controller.Configuration = new HttpConfiguration();
      controller.Configuration.Routes.MapHttpRoute(name: "DefaultApi", 
                                         routeTemplate: "api/{controller}/{id}",
                                         defaults: new { id = RouteParameter.Optional });

      controller.RequestContext.RouteData = new HttpRouteData(route: new HttpRoute(),
                                                             values: new HttpRouteValueDictionary 
                                                                            { 
                                                                              { "controller", "tokens" } 
                                                                            });

      //Act
      var response = controller.Post(credentials);

      //Assert
      Assert.IsNotNull(response);
}

您將必須將Membership封裝在一個類上,例如MembershipService。 您正在調用的所有成員資格API都將通過此類重定向。 這基本上使您能夠模擬單元測試中的實際Membership類行為。

因此,讓我們看一些代碼:

Controller.cs

[HttpPost]
public JsonResult GetLoggedInUserName()
{
    MembershipUser mem = _membershipService.GetUserDetails(User.Identity.Name);

    Guid membershipId = new Guid(mem.ProviderUserKey.ToString());
    var organizationUser = _organizationUserService.GetUserDetailsByMembershipId(membershipId);
    var  name = organizationUser.FirstName + " " + organizationUser.LastName;

    return Json(name);
}

MembershipService.cs

public class MembershipService : IMembershipService
{
    public MembershipUser GetUserDetails(string emailAddress)
    {
        return Membership.GetUser(emailAddress);
    }
}

MyTests.cs

    [TestMethod()]
    public void GetLoggedInUserName_InvokedWithValidSetup_ReturnUserName()
    {
        // Arrange

        // Setup membership to return mocked user
        var membershipService = new Mock<IMembershipService>();

        var user = new Mock<MembershipUser>();
        user.Setup(x => x.UserName).Returns("Adam");
        user.Setup(x => x.ProviderUserKey).Returns("1df03f8c-74fa-423a-8be8-61350b4da59f");
        user.SetupGet(x => x.Email).Returns("adamw@test.com");

        membershipService.Setup(m => m.GetUserDetails(It.IsAny<string>())).Returns(user.Object);

        // Setup organization user service - You can ignore it or replace
        // based on what you are using.
        var organizationUserService = new Mock<IOrganizationUserService>();
        var organizationUser = new OrganizationUser
        {
            FirstName = "Adam",
            LastName = "Woodcock",
            MembershipId = new Guid("1df03f8c-74fa-423a-8be8-61350b4da59f")
        };
        organizationUserService.Setup(s => s.GetUserDetailsByMembershipId(It.IsAny<Guid>())).Returns(organizationUser);

        var mock = new Mock<ControllerContext>();
        mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("Adam");
        var target = GetTargetController(membershipService, null, organizationUserService, null, null);
        target.ControllerContext = mock.Object;

        // Act
        var result = target.GetLoggedInUserName();

        // Assert
        Assert.AreEqual(organizationUser.FirstName + " " + organizationUser.LastName, result.Data);
    }

希望這可以幫助。

暫無
暫無

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

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