c# - How to test controller action that serializes a view -


alright trying test controller result make sure returning right values running number of problems mocking controller contexts. want test if enters number on page if jsonresult success = true. in controller serialize partial view , return html contains data pertinent request number. comfortable setting expected results in json result, can't test advance far. test gets hung when serializing partial view. don't care test don't know how work around result of function other create fakes controllercontext , let search serialize view.

here controller

[httppost] [recaptchacontrolmvc.captchavalidator] public jsonresult getpublicinformation(publicportalviewmodel model, bool captchavalid) {     if (captchavalid == true)     {         //check see if request number request         if (model.requestnumber != null)         {             //fill model data using calling service             model = _service.getpublicportaldata(model);             var content = base.serializeview("displaypublicinformation", model);             return json(new { success = true, htmlcontent = content });         }         else         {             return json(new { success = false, htmlcontent = "<span style=\"color: red;\">no request found number, please enter valid request number.</span>" });         }     }     else     {         return json(new { success = false, htmlcontent = "<span style=\"color: red;\">please enter valid captcha value</span>" });     } } 

specifically having problems line:

var content = base.serializeview("displaypublicinformation", model); 

here definition of function:

protected internal virtual string serializeview(string viewname, object model) {     if (string.isnullorempty(viewname))         viewname = controllercontext.routedata.getrequiredstring("action");      this.viewdata.model = model;      using (var sw = new stringwriter())     {         // keep getting null reference errors on line when write tests .         var viewresult = viewengines.engines.findpartialview(this.controllercontext, viewname);         var viewcontext = new viewcontext(this.controllercontext, viewresult.view, this.viewdata, this.tempdata, sw);         // render view stringwriter class         viewresult.view.render(viewcontext, sw);         // output rendered string         return sw.getstringbuilder().tostring();     } } 

here test apologize being messy wanted post @ currently. know there more code needed.

private partialviewresult _result; private mock<httpcontextbase> _mockhttpcontext; private httpcontextbase _httpcontext; private routedata _routedata; private routedata _parentroutedata;  protected mock<httpcontextbase> httpcontextbasemock; protected mock<httprequestbase> httprequestmock; protected mock<httpresponsebase> httpresponsemock;  [test] public void getpublicinformationvalidrequestnumber() {     var sut = new publicportalcontroller();     setuproutedata();     httpcontextbasemock = new mock<httpcontextbase>();     httpcontextbasemock.setupallproperties();     httprequestmock = new mock<httprequestbase>();     httpresponsemock = new mock<httpresponsebase>();     httpcontextbasemock.setupget(x => x.request).returns(httprequestmock.object);     httpcontextbasemock.setupget(x => x.response).returns(httpresponsemock.object);      var browser = new mock<httpbrowsercapabilitiesbase>(mockbehavior.strict);     var request = new mock<httprequestbase>(mockbehavior.strict);     var response = new mock<httpresponsebase>(mockbehavior.strict);     var session = new mock<httpsessionstatebase>(mockbehavior.strict);     var server = new mock<httpserverutilitybase>(mockbehavior.strict);     var cookies = new httpcookiecollection();     var items = new listdictionary();      var mockviewengine = new mock<iviewengine>();      mock<iview> view = new mock<iview>();     var viewresult = new viewengineresult(new[] { "location1", "location2" });      mockviewengine         .setup(x => x.findview(it.isany<controllercontext>(), it.isany<string>(), it.isany<string>(), it.isany<bool>()))         .returns(viewresult);      viewengines.engines.clear();     viewengines.engines.add(mockviewengine.object);      browser.setup(b => b.ismobiledevice).returns(false);     request.setup(r => r.cookies).returns(cookies);     request.setup(r => r.validateinput());     request.setup(r => r.useragent).returns("mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.11 (khtml, gecko) chrome/23.0.1271.64 safari/537.11");     response.setup(r => r.cookies).returns(cookies);      request.setup(r => r.browser).returns(browser.object);     httpcontextbasemock.setup(ctx => ctx.items).returns(items);      var routes = new routecollection();      var controllercontext = new mock<controllercontext>(httpcontextbasemock.object, _routedata, sut);      var controller = new mock<publicportalcontroller>();      controllercontext.setupget(c => c.controller).returns(controller.object);     controllercontext.setupget(c => c.httpcontext).returns(httpcontextbasemock.object);      sut.url = new urlhelper(new requestcontext(httpcontextbasemock.object, _routedata), routes);     sut.controllercontext = controllercontext.object;     var basecontroller = new mock<requestitbasecontroller>();      var fakepublicportalviewmodel = new mock<publicportalviewmodel>();     fakepublicportalviewmodel.setup(m => m.requestnumber).returns("23");     bool captchavalid = true;      basecontroller.setup(c => c.serializeview("displaypublicinformation", fakepublicportalviewmodel)).returns("");      var result = sut.getpublicinformation(fakepublicportalviewmodel.object, captchavalid) jsonresult;     dynamic jsonobject = result.data;      assert.istrue(jsonobject.success); }  private void setuproutedata() {     setupparentroutedata();     var viewcontext = new viewcontext { routedata = _parentroutedata };      _routedata = new routedata();     _routedata.values.add("controller", "publicportalcontroller");     _routedata.values.add("action", "getpublicinformation");     _routedata.datatokens["parentactionviewcontext"] = viewcontext; }  private void setupparentroutedata() {     _parentroutedata = new routedata();     _parentroutedata.values.add("controller", "publicportalcontroller");     _parentroutedata.values.add("action", "index"); } 

dependencies, gotta love dependencies, better yet static dependencies.

if underlying code in serializeview not important unit test, easiest thing abstract out method type , inject instead of inheriting base class....

something this:

public interface iviewhelper {     string serializeview(controllercontext context, viewdatadictionary viewdata, tempdatadictionary tempdata,         string viewname, object model); }      public class viewhelper : iviewhelper {     private readonly viewenginecollection _viewengines = viewengines.engines;      public string serializeview(controllercontext context, viewdatadictionary viewdata, tempdatadictionary tempdata, string viewname, object model)     {         viewdata.model = model;         using (var sw = new stringwriter())         {             // keep getting null reference errors on line when write tests .             var viewresult = _viewengines.findpartialview(context, viewname);             var viewcontext = new viewcontext(context, viewresult.view, viewdata, tempdata, sw);             // render view stringwriter class             viewresult.view.render(viewcontext, sw);             // output rendered string             return sw.getstringbuilder().tostring();         }     } } 

then in controller:

public publicportalcontroller(..., iviewhelper helper) {     _helper = helper; }  ....  public jsonresult getpublicinformation(publicportalviewmodel model, bool captchavalid) {     ....             //fill model data using calling service             model = _service.getpublicportaldata(model);             var content = _helper.serializeview(controllercontext, viewdata, tempdata, "displaypublicinformation", model);             return json(new { success = true, htmlcontent = content });    .... } 

now in test have mock out iviewhelper , should away laughing:

var mockhelper = new mock<iviewhelper>();         mockhelper.setup(             x =>                 x.serializeview(it.isany<controllercontext>(), it.isany<viewdatadictionary>(),                     it.isany<tempdatadictionary>(), "", it.isany<publicportalviewmodel>())).returns("<html></html>");          var sut = new publicportalcontroller(mockservice, ... , mockhelper.object);          var fakepublicportalviewmodel = new publicportalviewmodel{requestnumber = "23"};         bool captchavalid = true;          var result = sut.index(fakepublicportalviewmodel, captchavalid) jsonresult;         dynamic jsonobject = result.data; 

Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -