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