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
Post a Comment