私はWord
エンティティのセットを持つProject
エンティティを持っています。私のWordsRepository
は、Project
エンティティによって異なります。それは、プロジェクトに含まれる言葉のセットを操作する必要があります。モデルは2つのリポジトリによって異なります。そのうちの1つを模擬する方法は?
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
を再作成する必要がありますが、この方法テスト可能ではありません。
どうすれば偽装できますか?
ありがとうございます!本当に良いアイデアです!私はちょうどRoy Asheroveの.net unit testing bookに関する本の中で、依存する方法の一つとして覚えています。私はアドバイスできますか?それぞれのリポジトリまたは1つのアプリケーション全体のレポクラスに対して1つのファクトリクラスを作成する価値はありますか? – kseen
各リポジトリの工場。すべてのための巨大なリポジトリを持っていることは、そのコードファイルを巨大な割合に膨張させるように思えます。 – Tejs
レポジトリの工場クラスにはその機能がありますか?私のプロジェクトの現時点では、単に 'CreateNewRepository'メソッドがあります。それはそれです。私はこのクラスで必要とする他の機能を想像することはできません。 – kseen