Project
エンティティのセットを含むWord
エンティティがあります。私は実体WordsRepository
に依存します。Project
プロジェクトに含まれる一連の単語に対して機能する必要があります。
public interface IWordsRepository
{
List<Word> FetchAll();
}
public class WordsRepository : IWordsRepository
{
private readonly Project _project;
public WordsRepository(Project project)
{
if (project == null)
throw new ArgumentNullException("project");
this._project = project;
}
public List<Word> FetchAll()
{
// code for retrieveing words for the project from the database
}
}
それでは、もう少し深く掘り下げましょう。これが私のProjectsModel
です。
public class ProjectsModel
{
private readonly IProjectsRepository _rep;
private IWordsRepository _wordsRep;
private IProjectsModelObserver _presenter;
// Regular contructor for usual purpose
public ProjectsModel()
{
this._rep = new ProjectsRepository(Program.context);
}
public ProjectsModel(IProjectsRepository repository)
{
this._rep = repository;
}
public virtual void AttachPresenter(IProjectsModelObserver observer)
{
this._presenter = observer;
}
public List<Project> projects
{
get
{
List<Project> tmpList = _rep.FetchAll();
return (tmpList != null) ? tmpList : new List<Project>();
}
}
private Project _selectedProject;
public Project selectedProject
{
get
{
if (_selectedProject == null)
_selectedProject = projects.FirstOrDefault();
return _selectedProject;
}
set
{
if (!projects.Contains(value))
throw new InvalidOperationException("Project not in the Projects list");
_selectedProject = projects[projects.IndexOf(value)];
// Recreating Words repository depending on project
// Here is my issue:
// As I should recreate the Words repository here, passing a new selected project
// how can I mock it and make this class testable?
this._wordsRep = new WordsRepository(this._selectedProject);
if (this._presenter != null)
this._presenter.SelectedProjectChanged(_selectedProject);
}
}
private List<Word> _words;
public List<Word> Words
{
get
{
// Fetching set of words in Project. Just invoking a words repository
}
}
}
モデルの選択したプロジェクトが変更されると、を再作成する必要WordsRepository
がありますが、この方法ではテストできません。
どうすればそれをモックできますか?