![](/img/trans.png)
[英]How to unit test methods that use System.Web.Security.Membership inside?
[英]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.