c# - When should I use the .As method of Moq? -


when need use .as method provided moq?

from quickstart documentation:

// implementing multiple interfaces in mock var foo = new mock<ifoo>(); var disposablefoo = foo.as<idisposable>(); // ifoo mock implements idisposable :) disposablefoo.setup(df => df.dispose()); 

but don't why want that. give me practical example?

okay, example. let's have transportation management software manage movement of cars, flights, etc. there different vehicles move on land or air (no sea simplify sample).

public interface imovingonland {     string move(); }  public interface imovinginair {     string move(); } 

and there express transport option vehicle/aircraft.

public interface iexpresstransport {     string movedirectly(); } 

there transport manager class responsible moving vehicles/aircraft. , handles express means of transportation bit differently regular ones (for sake of simplicity in sample prints different message depending whether it's iexpresstransport or not):

public class transportmanager {     public string moveitem(imovinginair aircraft)     {         if (aircraft iexpresstransport)         {             return "message express aircraft: " +                 ((iexpresstransport)aircraft).movedirectly();         }         return "message aircraft: " + aircraft.move();     }      public string moveitem(imovingonland landvehicle)     {         if (landvehicle iexpresstransport)         {             return "message express land vehicle: " +                 landvehicle.move() +                 ((iexpresstransport)landvehicle).movedirectly();         }         return "message land vehicle: " + landvehicle.move();     } } 

now test if airplane behaves differently car. , also, if regular flight handled differently express one. test object imovinginair object , iexpresstransport. test flight behaviour can create mock<imovinginair>. extend flight express 1 have use as<iexpresstransport>() method:

[testmethod] public void testtransportmanager() {     transportmanager manager = new transportmanager();      // create regular flight.     var flight = new mock<imovinginair>();     flight.setup(x => x.move())         .returns("air craft moved next stop.");      // create flight.     var flightexpress = new mock<imovinginair>();     // add standard behaviour.     flightexpress         .setup(x => x.move())         .returns("air craft moved next stop.");     // extend express , add express flight behaviour.     flightexpress         .as<iexpresstransport>()         .setup(x => x.movedirectly())         .returns("air craft moved directly destination.");      // results.     var res = manager.moveitem(flight.object);     var resexp = manager.moveitem(flightexpress.object);      // sssert flight , express fligh returned different messages.     assert.arenotequal(res, resexp);      // assert expected messages have been returned.     assert.areequal("message aircraft: air craft moved next stop.", res);     assert.areequal("message express aircraft: air craft moved directly destination.", resexp); } 

Comments

Popular posts from this blog

javascript - Google App Script ContentService downloadAsFile not working -

javascript - Function overwritting -

c# - Exception when attempting to modify Dictionary -