c# - Mock AsNoTracking Entity Framework -


how mock asnotracking method?
in below example, dbcontext has injected service class.it works fine if remove asnotracking extension method getorderedproducts method, asnotracking test fails because returns null. i've tried mock asnotracking return proper value didn't work.

public interface iunitofwork {     idbset<tentity> set<tentity>() tentity : class;     int saveallchanges(); }  public class entites : dbcontext, iunitofwork {     public virtual dbset<product> products { get; set; }  // virtual because moq needs override behaviour      public new virtual idbset<tentity> set<tentity>() tentity : class   // virtual because moq needs override behaviour      {         return base.set<tentity>();     }      public int saveallchanges()     {         return base.savechanges();     } }      public class productservice {     private readonly idbset<product> _products;     private readonly iunitofwork _uow;      public productservice(iunitofwork uow)     {         _uow = uow;         _products = _uow.set<product>();     }     public ienumerable<product> getorderedproducts()     {         return _products.asnotracking().orderby(x => x.name).tolist();     } }      [testfixture] public class productservicetest {     private readonly productservice _productservice;      public productservicetest()     {         iqueryable<product> data = getroadnetworks().asqueryable();         var mockset = new mock<dbset<product>>();         mockset.as<iqueryable<product>>().setup(m => m.provider).returns(data.provider);         mockset.as<iqueryable<product>>().setup(m => m.expression).returns(data.expression);         mockset.as<iqueryable<product>>().setup(m => m.elementtype).returns(data.elementtype);         mockset.as<iqueryable<product>>().setup(m => m.getenumerator()).returns(data.getenumerator());         var context = new mock<entites>();         context.setup(c => c.products).returns(mockset.object);         context.setup(m => m.set<product>()).returns(mockset.object);         context.setup(c => c.products.asnotracking()).returns(mockset.object);         _productservice = new productservice(context.object);     }      private ienumerable<product> getroadnetworks()     {         return new list<product>         {             new product             {                 id = 1,                 name = "a"             },             new product             {                 id = 2,                 name = "b"             },             new product             {                 id = 1,                 name = "c"             }         };     }      [test]     public void getorderedproducttest()     {         ienumerable<product> products = _productservice.getorderedproducts();         list<string> names = products.select(x => x.name).tolist();         var expected = new list<string> {"a", "b", "c"};         collectionassert.areequal(names, expected);     } } 

the problem asnotracking returns null in unit test enter image description here

looking @ source code of asnotracking() extension method:

public static iqueryable asnotracking(this iqueryable source) {     var asdbquery = source dbquery;     return asdbquery != null ? asdbquery.asnotracking() : commonasnotracking(source); } 

since source (your dbset<product> you're trying mock) indeed dbquery (because dbset deriving dbquery), tries invoke 'real' (non-mocked) asnotracking() method rightfully returns null.

try mock asnotracking() method well:

mockset.setup(x => x.asnotracking()).returns(mockset.object); 

Comments

Popular posts from this blog

Command prompt result in label. Python 2.7 -

javascript - How do I use URL parameters to change link href on page? -

amazon web services - AWS Route53 Trying To Get Site To Resolve To www -