Word
엔티티가 포함 된 Project
엔티티가 있습니다. 내 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
다시해야하지만,이 방법으로 테스트 할 수 없습니다.
어떻게 조롱 할 수 있습니까?
고마워요! 정말 좋은 생각입니다! 나는 Roy Asherove의 .net unit testing book에 대한 의존성 방법을 깨뜨리는 것으로 기억한다. 나에게 조언 해 주실 수 있겠습니까? 각 저장소 또는 하나의 전체 응용 프로그램 클래스에 대해 하나의 팩토리 클래스를 만들 가치가 있습니까? – kseen
각 저장소에 대한 공장. 모든 것을위한 거대한 저장소를 갖는 것은 그 코드 파일을 괴상한 비율로 불러 일으키는 것처럼 보입니다. – Tejs
리포지토리 팩토리 클래스에 해당 기능이 있습니까? 내 프로젝트의 순간에 단지'CreateNewRepository' 메소드가 있고 그것은 바로 그것입니다. 나는이 클래스에서 내가 필요로하는 다른 기능을 상상할 수 없다. – kseen