I (öğretici Create an ASP.NET MVC 5 App with Facebook and Google OAuth2 and OpenID Sign-on (C#) gösterildiği gibi) yeni bir özellik ekleyerek ApplicationUser sınıfını uzatıyorumBirim Test ASP.NET MVC5 App
public class ApplicationUser : IdentityUser
{
public DateTime BirthDate { get; set; }
}
Şimdi doğrulamak için bir birim test oluşturmak istiyorum benim AccountController BirthDate'i doğru şekilde kaydediyor.
Ben controller.Register yöntemi referans amaçlı Ben burada dahil ediyorum MVC5 tarafından oluşturulan Demirbaş kodu ancak TestUserStore
[TestMethod]
public void Register()
{
// Arrange
var userManager = new UserManager<ApplicationUser>(new TestUserStore<ApplicationUser>());
var controller = new AccountController(userManager);
// This will setup a fake HttpContext using Moq
controller.SetFakeControllerContext();
// Act
var result =
controller.Register(new RegisterViewModel
{
BirthDate = TestBirthDate,
UserName = TestUser,
Password = TestUserPassword,
ConfirmPassword = TestUserPassword
}).Result;
// Assert
Assert.IsNotNull(result);
var addedUser = userManager.FindByName(TestUser);
Assert.IsNotNull(addedUser);
Assert.AreEqual(TestBirthDate, addedUser.BirthDate);
}
adlı bir bellek içi kullanıcı mağaza oluşturduk.
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser() { UserName = model.UserName, BirthDate = model.BirthDate };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
AddErrors(result);
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Kayıt'ı aradığımda, sorunun nerede oluşacağını SignInAsync çağırır. düşük katmanda
private async Task SignInAsync(ApplicationUser user, bool isPersistent)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
, demirbaş kod çerez
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
problm kök meydana geldiği Bu içerir. GetOwinContext'e yapılan bu çağrı, taklit edemediğim ve bir saplama ile değiştiremediğim bir uzantı yöntemidir (tabiki kod değiştirmedikçe). Ben bu testi çalıştırdığınızda
ASP.NET MVC ekibi kodu test edilebilir hale getirmek için çok çalıştık bir istisna önceki sürümlerde
Test method MVCLabMigration.Tests.Controllers.AccountControllerTest.Register threw exception:
System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.HttpContextBaseExtensions.GetOwinEnvironment(HttpContextBase context)
at System.Web.HttpContextBaseExtensions.GetOwinContext(HttpContextBase context)
at MVCLabMigration.Controllers.AccountController.get_AuthenticationManager() in AccountController.cs: line 330
at MVCLabMigration.Controllers.AccountController.<SignInAsync>d__40.MoveNext() in AccountController.cs: line 336
olsun. Şimdi bir AccountController'ı test etmenin kolay olmayacağı yüzeyde görünüyor. Bazı seçimlerim var. o bir uzantısı yöntemini çağırın ve o seviyede bu sorunla
Kurulumu test amaçlı Owin boru hattı başa kalmaması
Ben
kazan plaka kodunu değiştirin edebilirsiniz
AuthN/AuthZ altyapısını gerektiren bir sınama kodu yazmaktan kaçının (makul bir seçenek değil)
Hangi yolun daha iyi olduğundan emin değilim. Ya bunu çözebiliriz. Benim sorum şu ki en iyi strateji hangisidir.
Not: Yazmadığım kodu sınamanıza gerek duymadığımı biliyorum. UserManager altyapısı MVC5'i sağladı ancak böyle bir uygulama altyapısı var ama eğer benim Uygulama Yapımcı modifikasyonlarımı doğrulayan testler yazmak veya kullanıcı rollerine bağlı davranışları doğrulayan bir kod yazmak istiyorsanız UserManager'ı kullanarak test etmeliyim.
hi hakkında söz öğretici işaret lütfen edebilirsiniz. Sorunuzu, Kayıt yönteminin uygulamanızla güncelleyebiliyorsanız, yardımcı olacaktır. – Spock
HttpContext, birim testleriniz referans alındığında boş bırakılacaktır. Kullandığınız özelliklerin değerlerini döndürmek için sahte bir HttpContext nesnesi enjekte etmeniz gerekebilir. –
Sahte bir kurulum yaptım - yukarıdaki örnek kodda değildim ama şimdi ekledim. –