मैं (के रूप में ट्यूटोरियल Create an ASP.NET MVC 5 App with Facebook and Google OAuth2 and OpenID Sign-on (C#) में दिखाया गया है) एक नया संपत्ति जोड़कर ApplicationUser वर्ग का विस्तार कर रहा हूँयूनिट टेस्टिंग ASP.NET MVC5 अनुप्रयोग
public class ApplicationUser : IdentityUser
{
public DateTime BirthDate { get; set; }
}
अब मुझे लगता है कि सत्यापित करने के लिए एक यूनिट टेस्ट बनाना चाहते हैं मेरे खाता नियंत्रक सही ढंग से जन्मदिन को सहेज रहा है।
मैं एक में स्मृति उपयोगकर्ता की दुकान controller.Register विधि संदर्भ उद्देश्यों के लिए मैं इसे यहाँ शामिल कर रहा हूँ MVC5 द्वारा उत्पन्न बॉयलरप्लेट कोड है, लेकिन 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);
}
नामित बना लिया है।
// 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);
}
जब मैं रजिस्टर कहता हूं, तो यह साइनइनएसिंक को कॉल करता है, जहां समस्या होगी।
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);
}
निम्नतम स्तर पर, बॉयलरप्लेट कोड इस tidbit
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
यह वह जगह है जहां problm की जड़ होती है भी शामिल है। GetOwinContext को यह कॉल एक एक्सटेंशन विधि है जिसे मैं नकल नहीं कर सकता और मैं स्टब के साथ प्रतिस्थापित नहीं कर सकता (जब तक कि मैं बॉयलरप्लेट कोड नहीं बदलता)।
जब मैं इस परीक्षण चलाने मैं एक अपवाद
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
पूर्व विज्ञप्ति में मिल ASP.NET MVC टीम कोड परीक्षण योग्य बनाने के लिए बहुत मेहनत की है। ऐसा लगता है कि अब एक खाता नियंत्रक का परीक्षण करना आसान नहीं होगा। मेरे पास कुछ विकल्प हैं।
मैं
बॉयलर प्लेट कोड को संशोधित कर सकते हैं इतना है कि यह एक विस्तार विधि कॉल नहीं करता है और उस स्तर पर इस समस्या से निपटने के
सेटअप परीक्षण प्रयोजनों के लिए Owin पाइपलाइन
लेखन कोड लिखने से बचें जिसके लिए ऑथन/ऑथज़ इंफ्रास्ट्रक्चर (उचित विकल्प नहीं)
मुझे यकीन नहीं है कि कौन सी सड़क बेहतर है। कोई भी इसे हल कर सकता है। मेरा सवाल नीचे उबलता है जो सबसे अच्छी रणनीति है।
नोट: हाँ, मुझे पता है कि मुझे उस कोड का परीक्षण करने की आवश्यकता नहीं है जिसे मैंने नहीं लिखा था। UserManager आधारभूत संरचना प्रदान की गई एमवीसी 5 बुनियादी ढांचे का एक टुकड़ा है लेकिन यदि मैं उन परीक्षणों को लिखना चाहता हूं जो एप्लिकेशनयूसर या कोड में मेरे संशोधन को सत्यापित करते हैं जो उपयोगकर्ता की भूमिकाओं पर निर्भर व्यवहार की पुष्टि करता है तो मुझे UserManager का उपयोग करके परीक्षण करना होगा।
हाय क्या आप कृपया बताए गए ट्यूटोरियल को इंगित कर सकते हैं। अगर आप रजिस्टर विधि के कार्यान्वयन के साथ अपना प्रश्न अपडेट कर सकते हैं तो यह सहायक भी होगा। – Spock
आपके यूनिट परीक्षणों के संदर्भ में HttpContext शून्य होगा। आपके द्वारा उपयोग की जाने वाली संपत्तियों के मानों को वापस करने के लिए आपको एक नकली HttpContext ऑब्जेक्ट इंजेक्ट करने की आवश्यकता हो सकती है। –
मेरे पास एक नकली सेटअप था - ऊपर नमूना कोड में नहीं था लेकिन मैंने इसे अभी जोड़ा है। –