c# - Mocking generic repository factory method -




i've made refactoring if our repository factory make more generic , right method creating repositories looks that:

public trepository createrepository<trepository>(params object[] parameters)         trepository : class {     if (_serviceprovider == null)         throw new argumentnullexception(nameof(_serviceprovider));      return activatorutilities.createinstance<trepository>(_serviceprovider, parameters); } 

in production code using , works charm:

_concreterepo = repofactory.createrepository<concreterepo>(); 

but when trying refactor unit tests having difficulties setting factory, how doesn't work.

public class tests  {     // since using moq can't mock abstract types having problems type conversion in set up.     protected readonly mock<iconcreterepository> _concreterepositorymock = new mock<iconcreterepository>();     protected readonly mock<irepositoryfactory> _factorymock = new mock<irepositoryfactory>();      [setup]     public void setup()     {         // if don't cast concreterepositorymock compiler complains cannot convert abstract concrete repository.         // if cast fails , returns null.          _factorymock.setup(f => f.createrepository<concreterepository>())             .returns(_concreterepositorymock.object concreterepository);     } } 

any idea how can workaround it? seems createrepository method returning concrete types, mocking cannot mock concrete repository.also couldn't pass abstract types createrepository, because createinstance requires concrete types.

i think issue expect mock object:

protected readonly mock<iconcreterepository> _concreterepositorymock = new mock<iconcreterepository>(); 

to instance of concreterepository, wrong assumption.

_concreterepositorymock.object iconcreterepository 

this should "true" while

_concreterepositorymock.object concreterepository 

this should "false".

you have either switch prod code happy abstraction (iconcreterepository) or mock final class

protected readonly mock<concreterepository> _concreterepositorymock = new mock<concreterepository>(); 

in mock (note mocking concrete classes not easy - need mocked methods virtual etc.).





wiki

Comments

Popular posts from this blog

Asterisk AGI Python Script to Dialplan does not work -

python - Read npy file directly from S3 StreamingBody -

kotlin - Out-projected type in generic interface prohibits the use of metod with generic parameter -