Unit test using dependency injection and mock objects without hitting Database -


i'm new unit testing.can explain me how done unit testing without hitting database.

and want know that, is dependency injection essential unit testing? if yes, explain me sample code. helpful me.

i had created unit testing login, hits database. want test same case login, without hitting database. in this, used microsoft.visualstudio.testtools.unittesting.

here code,

 [testmethod]     public void _01_loginuser_01_valid()     {                     bluser.user.userdto user = new bluser.user.userdto();         user.username = "mohan";         user.userpassword = "abc";         bluser.model.fs_user result = bluser.user.loginuser(user);         assert.areequal("mohan", result.username);     } 

and business logic is,

 public static fs_user loginuser(userdto userdto)     {                                            try         {             var context = new userdbentities();             {                                     var loginuser = context.fs_user.where(u => u.username == userdto.username && u.userpassword == userdto.userpassword).singleordefault();                 if (loginuser == null)                     validationerror.loginexception((int)exceptioncodes.invalidpassword);                 return loginuser;             }         }         catch (exception ex)         {             throw ex;         }                             } 

see answer here: solid principle examples anywhere?

if @ idea of depending on interface data access, you'll see how supply 'fake' implementation of interface testing not depend on database.

based on example, need make following changes:

public class loginthing {     private readonly iamsomecontext context;      public loginthing(iamsomecontext context)     {         this.context = context;     }      public fs_user loginuser(userdto userdto)     {                                            try         {             var loginuser =                  this.context.fs_user                     .singleordefault(                        u =>                             u.username == userdto.username                             && u.userpassword == userdto.userpassword);              if (loginuser == null)                 validationerror.loginexception((int)exceptioncodes.invalidpassword);              return loginuser;         }         catch (exception ex)         {             throw ex;         }                             } } 

and test can become like:

[testmethod] public void _01_loginuser_01_valid() {                 bluser.user.userdto user = new bluser.user.userdto();     user.username = "mohan";     user.userpassword = "abc";      var fakecontext = createfakecontextwith(user);      var thingundertest = new loginthing(fakecontext);      bluser.model.fs_user result = thingundertest.loginuser(user);      assert.areequal("mohan", result.username); } 

creating fake context this, if used nsubstitute:

private iamsomecontext createfakecontextwith(bluser.user.userdto user) {     var fakecontext = substitute.for<ifakecontext>();      fakecontext.fs_user.returns(new list(new[] {user}));      return fakecontext; } 

the syntax might not exact, point...


Comments

Popular posts from this blog

php - Wordpress website dashboard page or post editor content is not showing but front end data is showing properly -

javascript - Get parameter of GET request -

javascript - Twitter Bootstrap - how to add some more margin between tooltip popup and element -