এএসপি.নেট এমভিসি: ইউনিট টেস্টিং কন্ট্রোলাররা যা ইউরেলহেল্পার ব্যবহার করে


170

আমার কন্ট্রোলারগুলির একটি ক্রিয়াকলাপ, যেটি আজাক্স অনুরোধে ডাকা হচ্ছে, সেটি ক্লায়েন্টের পক্ষে একটি URL ফিরিয়ে দিচ্ছে যাতে এটি পুনঃনির্দেশ করতে পারে। আমি ব্যবহার করছি Url.RouteUrl(..)এবং আমার ইউনিট পরীক্ষার সময় Controller.Urlপ্যারামিটারটি পূর্বে ভরাট না হওয়ায় এটি ব্যর্থ হয়।

আমি প্রচুর পরিমাণে চেষ্টা করেছিলাম, অন্যদের মধ্যেও বাধা দেওয়ার চেষ্টা করেছিলাম UrlHelper(যা ব্যর্থ হয়েছিল), ম্যানুয়ালি একটি স্টাবডযুক্ত (যা একটি কলটিতে ব্যর্থ হয়েছিল ) UrlHelperদিয়ে একটি তৈরি করেছিল ।RequestContextHttpContextBaseRouteCollection.GetUrlWithApplicationPath

আমি গুগল অনুসন্ধান করেছি কিন্তু বিষয়টিতে কার্যত কিছুই পাইনি। আমি কি Url.RouteUrlআমার কন্ট্রোলার অ্যাকশন ব্যবহার করে অবিশ্বাস্যভাবে বোকা কিছু করছি? কোন সহজ উপায় আছে?

এটিকে আরও খারাপ করার জন্য, আমি আমার ইউনিট পরীক্ষায় প্রত্যাবর্তিত ইউআরএল পরীক্ষা করতে সক্ষম হতে চাই - আসলে আমি কেবল এটি সঠিক পথে ফিরে যাচ্ছি তা জানতে আগ্রহী, তবে যেহেতু আমি কোনও ইউআরএল পরিবর্তে ফিরে আসছি রুট, আমি সমাধান করা ইউআরএল নিয়ন্ত্রণ করতে চাই (উদাহরণস্বরূপ: স্টাবড ব্যবহার করে RouteCollection) - তবে আমি আমার পরীক্ষাটি শুরু হতে পেরে খুশি হব।

উত্তর:


202

এখানে আমার পরীক্ষার মধ্যে একটি (xUnit + Moq) ঠিক অনুরূপ ক্ষেত্রে (কন্ট্রোলারে ইউআরএল.রোউটআরএল ব্যবহার করে)

আশাকরি এটা সাহায্য করবে:

var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());

var response = new Mock<HttpResponseBase>(MockBehavior.Strict);
response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1");

var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);

var controller = new LinkbackController(dbF.Object);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);

2
আপাতত আমি এমন একটি সমাধান নিয়ে গিয়েছিলাম যেখানে আমি উরলহেল্পারের কাছে কলগুলি দূরে সরিয়ে রেখেছি যাতে আমি সেগুলি আটকাতে পারি। আপনার স্নিপেটের জন্য ধন্যবাদ, তবে কীভাবে একটি অনুরোধ / প্রতিক্রিয়া / কন্ট্রোলার কনটেক্সটকে সঠিকভাবে উপহাস করতে হবে তা নির্ধারণ করে আমার অনেক সময় সাশ্রয় হবে।
এফডি

@ ইউ-জি-নে উত্তরের জন্য ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে। আপডেটমোডেল দ্বারা ব্যবহৃত একটি ফর্মকলিকেশন প্যারামিটার ব্যবহার করতে আমি আরও কিছু মোকি সেটআপগুলি অন্তর্ভুক্ত করেছি
জেবিক্রাম

16
+1 দুর্দান্ত। যদিও একটি পরামর্শ: আমি এটি মকহেল্পার হিসাবে ব্যবহার করি এবং প্রতিক্রিয়াটি পরিবর্তন করি Apply এটিতে অ্যাপ্লিকেশনপথমোডিফায়ারের জন্য সেটআপ: প্রতিক্রিয়া.সেটআপ (x => x. অ্যাপ্লিকেশনপ্যাথমোডিফায়ার (Moq.It.IsAny <স্ট্রিং> ())) রিটার্নস ((স্ট্রিং url ) => ইউআরএল); এটি কুৎসিত, তবে আমি মানটি হার্ডকোডিংয়ের পরিবর্তে url এনকোডড আকারে সিরিয়ালযুক্ত বস্তুটি ফিরে পাই।
eduncan911

এটি আমার জন্য আংশিকভাবে কাজ করে। কোনও ধারণা কেন আমি নিয়ামক / কন্ট্রোলার / কর্মের পরিবর্তে পাব? আমার পরীক্ষাটি ব্যর্থ হয়েছে কারণ তারা বেশিরভাগ এক নয় এবং তবুও আমি একই রাউটিংয়ের মানগুলি নিবন্ধভুক্ত করি। খুব বিজোড় ...
নিক

3
ApplyAppPathModifierঅংশ UrlHelper সঙ্কটপূর্ণ বিট
ক্রিস এস

37

ইউ-জি-নে থেকে পরিবর্তিত বাস্তবায়ন। এটির মাধ্যমে অ্যাপ্লিকেশনটিতে সংজ্ঞায়িত রুটের উপর ভিত্তি করে একটি উত্পন্ন লিঙ্ক দেওয়া হয়। ইইউ-জি-নে এর উদাহরণ সর্বদা একটি স্থির প্রতিক্রিয়া ফিরিয়ে দেয়। নীচের পদ্ধতির সাহায্যে আপনি পরীক্ষা করতে পারবেন যে সঠিক ক্রিয়া / নিয়ন্ত্রক এবং রুট তথ্যটি UrlHelper এ চলেছে - যা আপনি যদি urlHelper এ কল পরীক্ষা করে যাচ্ছেন তবে আপনি যা চান তা চাই।

var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();

context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);

request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new NameValueCollection());

response.Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())).Returns<string>(x => x);

context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);

var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);
var helper = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);

12

আপনি যদি এইচটিটিপি কনটেক্সটবেস ক্লাসটি উপহাস করতে চান তবে এই পোস্টটি কার্যকর হতে পারে।

http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx


শীতল, এটি আমাকে সহায়তা করেছে, যদিও সাহায্যকারীকে ফুঁকানো বন্ধ করতে আমাকে ফেকহ্যাটপ কনটেক্সট পদ্ধতিতে কিছু অতিরিক্ত কোড যুক্ত করতে হয়েছিল: প্রসঙ্গ.সেটআপ (সিটিএক্স => সিটিএক্স.আরকোয়েস্ট.এপ্লিকেশনপাথ)। রিটার্নস ("/ অ্যান্টি ব্লুআপ"); আমি কোডটি রিফ্যাক্টরও করেছি যাতে এটি নতুন সেটআপ () সিনট্যাক্স ব্যবহার করে। ধন্যবাদ।
রিচার্ডড

2

@ ইউ-জি-নে দ্বারা উত্তরটি তৈরি করা যা আমাকে দারুণভাবে সহায়তা করেছে:

আমার অ্যাকশনরেসাল্ট ছিল যা একটি পুনর্নির্দেশের পাশাপাশি একটি ফর্মকলাকরণ প্যারামিটারের সাথে আপডেটডোডেল কল করেছিল। আপডেটমোডেল () কাজ করার জন্য আমাকে এটি আমার মক্কৃত এইচটিপিআরকুয়েস্টবেজে যুক্ত করতে হয়েছিল:

FormCollection collection = new FormCollection();
collection["KeyName"] = "KeyValue";

request.Setup(x => x.Form).Returns(collection);
request.Setup(x => x.QueryString).Returns(new NameValueCollection());

পুনঃনির্দেশিত URL টি সঠিক ছিল কিনা তা পরীক্ষা করতে, আপনি নিম্নলিখিতগুলি করতে পারেন:

RedirectResult result = controller.ActionName(modelToSubmit, collection) as RedirectResult;
Assert.AreEqual("/Expected/URL", result.Url);

1

http://kbochevski.blogspot.com/2010/06/unit-testing-mvcnet.html ইউনিট পরীক্ষার সাহায্যে সমস্ত স্তরকে কীভাবে আবরণ করা যায় তা আলোচনা করে I এটি নিয়ামক পরীক্ষার জন্য রাইনো এবং এমভিসি.কন্ট্রিবি ব্যবহার করে। গুগলে সোর্স কোডটি একটি দুর্দান্ত সহায়ক হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.