CustomMembershipProvider를 통해 데이터베이스 액세스가 필요한 단위 테스트를 작성합니다.단위 테스트에서 CustomMembershipProvider가 작동하지 않습니다.
edit
-
public class CustomMembershipProvider : MembershipProvider
{
public override bool ValidateUser(string username, string password)
{
using (var usersContext = new UsersContext())
{
var requiredUser = usersContext.GetUser(username, password);
var userApproved = usersContext.GetUserMem(username);
if (userApproved == null) return false;
return (requiredUser != null && userApproved.IsApproved != false);
}
}
}
[TestFixture]
public class AccountControllerTest
{
[Test]
public void ShouldNotAcceptInvalidUser()
{
// OPTION1
Mock<IMembershipService> membership = new Mock<IMembershipService>();
//OPTION2
// Mock<AccountMembershipService> membership = new Mock<AccountMembershipService>();
membership.Setup(m => m.ValidateUser(It.IsAny<string>(), It.IsAny<string>()))
.Returns(false);
var logonModel = new LoginModel() { EmailorUserName = "connorgerv", Password = "pasdsword1" };
var controller = new AccountController(membership.Object);
// Act
var result = controller.Login(logonModel,"Index") as RedirectResult;
// Assert
Assert.That(result.Url, Is.EqualTo("Index"));
Assert.False(controller.ModelState.IsValid);
Assert.That(controller.ModelState[""],
Is.EqualTo("The user name or password provided is incorrect."));
}
[Test]
public void ExampleForMockingAccountMembershipService()
{
var validUserName = "connorgerv";
var validPassword = "passwordd1";
var stubService = new Mock<CustomMembershipProvider>();
bool val = false;
stubService.Setup(x => x.ValidateUser(validUserName, validPassword)).Returns(true);
Assert.IsTrue(stubService.Object.ValidateUser(validUserName, validPassword));
}
}
public class AccountController : Controller
{
public IMembershipService MembershipService { get; set; }
public AccountController(IMembershipService service){
MembershipService=service;
}
protected override void Initialize(RequestContext requestContext)
{
if (MembershipService == null) { MembershipService = new AccountMembershipService(); }
base.Initialize(requestContext);
}
public ActionResult Index()
{
return RedirectToAction("Profile");
}
public ActionResult Login()
{
if (User.Identity.IsAuthenticated)
{
//redirect to some other page
return RedirectToAction("Index", "Home");
}
return View();
}
//
// POST: /Account/Login
[HttpPost]
public ActionResult Login(LoginModel model, string ReturnUrl)
{
if (ModelState.IsValid)
{
if (MembershipService.ValidateUser(model.EmailorUserName, model.Password))
{
SetupFormsAuthTicket(model.EmailorUserName, model.RememberMe);
if (Url.IsLocalUrl(ReturnUrl) && ReturnUrl.Length > 1 && ReturnUrl.StartsWith("/")
&& !ReturnUrl.StartsWith("//") && !ReturnUrl.StartsWith("/\\"))
{
return Redirect(ReturnUrl);
}
return RedirectToAction("Index", "Home");
}
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
// If we got this far, something failed, redisplay form
return View(model);
}
}
public class AccountMembershipService : IMembershipService
{
private readonly MembershipProvider _provider;
public AccountMembershipService()
: this(null)
{
}
public AccountMembershipService(MembershipProvider provider)
{
_provider = provider ?? Membership.Provider;
}
public virtual bool ValidateUser(string userName, string password)
{
if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", "userName");
if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", "password");
return _provider.ValidateUser(userName, password);
}
}
내가 MembershipService이 AccountController에서
Mock<IMembershipService>
것을 볼 수 있습니다 주석 옵션 1과
ShouldNotAcceptInvalidUser()
을 실행하지만 결코에 MembershipService.ValidateUser에 단계 없을 때 어떻게됩니까
Membership in web.config of main application
<membership defaultProvider="CustomMembershipProvider">
<providers>
<clear />
<add name="CustomMembershipProvider" type="QUBBasketballMVC.Infrastructure.CustomMembershipProvider" connectionStringName="UsersContext" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
public class CustomMembershipProvider : MembershipProvider
{
public override bool ValidateUser(string username, string password)
{
using (var usersContext = new UsersContext())
{
var requiredUser = usersContext.GetUser(username, password);
var userApproved = usersContext.GetUserMem(username);
if (userApproved == null) return false;
return (requiredUser != null && userApproved.IsApproved != false);
}
}
}
로그인 액션.
내가 옵션 2 실행
는 MembershipService가 accountcontroller에서Mock<AccountMembershipService>
이며 차례로 세트에
System.Web.Security.SqlMembershipProvider
또한 ExampleForMockingAccountMembershipService()
아무튼 '이다 SqlMembershipProvider
Membership.Provider
으로는 null 매개 변수를 사용하여 AccountMembership Contstructor을 명중 제외하고 같은 일이 발생 주석 처리 t ValidateUser
메서드에서 모두 CustomMembershipProvider
에있는 것처럼 보이며 항상 true를 반환합니다.
바라기를 이것은 내가 잘못 가고있는 곳을보기에 충분합니다. :/
? (예 :'_provider'가 여전히 'SqlMembershipProvider'로 표시됩니까?) 테스트 프로젝트의 app.config에 구성을 추가 한 후입니까? – Lilshieste
죄송합니다. 귀하의 회신을 본 적이 없으며 공급자가 여전히 SqlMembershipProvider로 표시됩니다! app.config에 설정을 추가하려고 시도했지만 운이 없었습니다! 이 코드가 작동해야합니까? '[테스트] public void ExampleForMockingAccountMembershipService() { var validUserName = "connorgerv"; var validPassword = "passwordd1"; var stubService = new Mock(); stubService.Setup (x => x.ValidateUser (validUserName, validPassword)). 반환 (true); Assert.IsTrue (stubService.Object.ValidateUser (validUserName, validPassword)); }' –
어리석은 질문을하는 것이 아니라, * test * 프로젝트의'app.config' 설정을 변경 했습니까? (즉, 'AccountMembershipService'가 정의 된 프로젝트가 아니라 테스트가 정의 된 프로젝트입니다.) 코드가 작동해야한다면'CustomMembershipProvider'에 대한 코드를 보지 않고 말하기 어렵습니다. 즉,'CustomMembershipProvider'를 테스트하려고한다면 조롱하면 안됩니다. – Lilshieste