c# - How to set the value of a query string in test method Moq -


i have following controller action method , writing unit test method

    try     {     if ( session["token"] == null)         {             //checking whether user has given credentials , got redirected survey monkey  checking query string 'code'             if (request.querystring["code"] != null)             {                 string tempauthcode = request.querystring["code"];                 session["token"] = _surveymonkeyservice.getsurveymonkeytoken(apikey, clientsecret, tempauthcode, redirecturi, clientid);             }             else             {                 //user coming first time directed authentication page                 string redirecturltosurveymonkeyauthentication = _surveymonkeyservice.geturltosurveymonkeyauthentication(redirecturi, clientid, apikey);                 return redirect(redirecturltosurveymonkeyauthentication);             }         }             //user in same session no need token again showing surveys without authentication         var model = _surveyservice.getsurveys(user.identity.name);         if (model.count == 0)             return view(cstview.nosurveytracker.tostring());         return view(cstview.index.tostring(), model);     }     catch (exception e)     {         return displayerrorview(e);//even returns redirect method      } 

and here 1 of unit test have written it,

    [test]     public void getindexpage_returns_view_with_validtoken()     {         var mockcontrollercontext = new mock<controllercontext>();         var mocksession = new mock<httpsessionstatebase>();         mocksession.setupget(s => s["surveymonkeyaccesstoken"]).returns(sampletoken);         mocksession.setupget(c => c["code"]).returns(sampletempauthcode);         mockcontrollercontext.setup(p => p.httpcontext.session).returns(mocksession.object);         _surveytrackercontroller.controllercontext = mockcontrollercontext.object;         _surveyservicemock.setup(x => x.getsurveys(testdata.testdata.sampleusername)).returns(surveytrackerlist);         var result = _surveytrackercontroller.getindexpage();         assert.isinstanceof(typeof(actionresult), result);         assert.areequal(((viewresult)result).viewname, "expected");     } 

when trying run test throwing error: object reference not set instance of object , , line number shows request.querystring , how set session variables in test methods, , can suggest me proper way check controller action return type.

query string

you need mock query string in httprequestbase object. need build object graph

controllercontext -> httpcontextbase -> httprequestbase

as mocking controllercontext of controller instance, can use following code add mocked query string:

var querystring = new namevaluecollection { { "code", "codevalue" } }; var mockrequest = new mock<httprequestbase>(); mockrequest.setup(r => r.querystring).returns(querystring); var mockhttpcontext = new mock<httpcontextbase>(); mockhttpcontext.setup(c => c.request).returns(mockrequest.object); mockcontrollercontext.setup(c => c.httpcontext).returns(mockhttpcontext.object); 

session

for mocked session, use same http context configured above return mock session object:

var mocksession = new mock<httpsessionstatebase>(); mockhttpcontext.setup(c => c.session).returns(mocksession.object); //where mockhttpcontext has been created in code querystring above , setup returned controller context 

then can set values way did using setupget, or can use setup in

mocksession.setup(s => s["token"]).returns("footoken") 

if want verify value set on session, can add assert code:

mocksession.verifyset(s => s["token"] = "tokenvalue", times.once); 

actionresult types

what cast result desired type using as operator. return null if conversion not possible. assert may this:

viewresult result = controller.index() viewresult;  // assert assert.isnotnull(result); assert.areequal("fooview", result.viewname); 

side note

if have many similar tests code using session and/or query string, there quite few mock objects need create , configure on every test.

you add setup method test class (which run before each test), , move there code builds object graph mocks. way have fresh controller instance on every test method , arrange part of every test need setup mocks behaviour , expectations.

for example, if have setup code in test class:

private homecontroller _homecontroller; private mock<httpsessionstatebase> _mocksession; private mock<httprequestbase> _mockrequest;  [setup] public void setup() {     _mockrequest = new mock<httprequestbase>();     _mocksession = new mock<httpsessionstatebase>();     var mockhttpcontext = new mock<httpcontextbase>();     var mockcontrollercontext = new mock<controllercontext>();      mockhttpcontext.setup(c => c.request).returns(_mockrequest.object);     mockhttpcontext.setup(c => c.session).returns(_mocksession.object);     mockcontrollercontext.setup(c => c.httpcontext).returns(mockhttpcontext.object);      _homecontroller = new homecontroller();     _homecontroller.controllercontext = mockcontrollercontext.object; } 

the code on every test reduced this:

[test] public void index_whennotokeninsession_returnsdummyviewandsetstoken() {     // arrange     var querystring = new namevaluecollection { { "code", "dummycodevalue" } };     _mocksession.setup(s => s["token"]).returns(null);     _mockrequest.setup(r => r.querystring).returns(querystring);      // act     viewresult result = _homecontroller.index() viewresult;      // assert     assert.isnotnull(result);     assert.areequal("dummy", result.viewname);     _mocksession.verifyset(s => s["token"] = "tokenvalue", times.once); }  [test] public void index_whentokeninsession_returnsdefaultview() {     // arrange     _mocksession.setup(s => s["token"]).returns("foo");      // act     viewresult result = _homecontroller.index() viewresult;      // assert     assert.isnotnull(result);     assert.areequal(string.empty, result.viewname); } 

where tests testing dummy index method

public actionresult index() {     if (session["token"] == null)     {         if (request.querystring["code"] != null)         {              session["token"] = "tokenvalue";             return view("dummy");         }     }     return view(); } 

Comments

Popular posts from this blog

php - SPIP: From Tag directly to an article -

jquery - isAjaxRequest always return false -

ruby on rails - In a controller spec, how to find a specific tag in the generated view? -