2014-01-07 2 views
0

Я узнаю о MVP, опыте, основанном на тестах, и заводском шаблоне. Я хочу написать несколько простых классов для хранения данных и репозитория. Данные человека будут храниться в sql и для тестирования в xml. Я читал о StructureMap, но не хочу использовать его, вместо этого хочу использовать простую фабричную реализацию, которая в конечном итоге также поможет мне подключиться к блочным тестовым сценариям. Вот мои занятия:Понимание подхода, управляемого тестированием для шаблона MVP?

class Person 
{ 
    int id; 
    string name; 
} 

interface IPersonRepository 
{ 
    Person GetPerson(int id) 
    { 
    } 
} 

class PersonRepositorySql : IPersonRepository 
{ 
    Person GetPerson(int id) 
    { 
     //Fetch from sql 
    } 
} 

class PersonRepositoryXML : IPersonRepository 
{ 
    Person GetPerson(int id) 
    { 
     //Fetch from XML 
    } 
} 

static class PersonRepositoryFactory 
{ 
    static PersonRepositorySql Create() 
    { 
     return new PersonRepositorySql(); 
    } 

    static PersonRepositoryXML CreateTest() 
    { 
     return new PersonRepositoryXML(); 
    } 
} 

class Presenter 
{ 
    Presenter(View _view) 
    { 
    } 

    void DoSomething() 
    { 
     IPersonRepository fact = PersonRepositoryFactory.Create(); 
     //fact.GetPerson(2); 
    } 

} 

class PresenterTest 
{ 
    void Test1() 
    { 
     IPersonRepository fact1 = PersonRepositoryFactory.CreateTest(); 
     //fact1.GetPerson(2); 
    } 
} 

Пожалуйста, скажите, подходит ли тот подход, который я принял, и другие рекомендации. Кроме того, поскольку я не передавал объекты в конструкторе, это не означает пример инъекции зависимостей?

+0

Ничто не основано на аббревиатурах, которые вводятся .., который является основным компонентом тестирования и TDD. Я думаю, вам следует перечитать ваш справочный материал, в частности, части о плотной связи и конкретных реализациях .. и инъекции зависимостей. –

+0

Пожалуйста, проверьте сейчас ... – user2645830

ответ

1

Прежде всего не зависят от классов, если вы хотите, чтобы ваш код тестируемым, зависит от интерфейса, который реализуется классом.

Занятия, которые зависят от ваших заводов, должны его ожидать от их пользователей. Благодаря этому вы можете легко обменять свой репозиторий в тестовом проекте и без изменений на тестируемый код.

Поэтому любой завод, у вас есть должно быть изменено на что-то вроде этого:

class PersonRepositoryXML: IPersonRepository 
{ 
    public IPerson GetPerson(int id) 
    { 
     //Fetch from XML 
    } 
} 

public interface IPersonRepository 
{ 
    IPerson GetPerson(int id); 
} 

// a dependent class 
class SomeDependentClass { 
    public SomeDependentClass(IPersonRepository repository) { 
     this.repository = repository; 
    } 

    public void Foo() { 
     var person = repository.GetPerson(10); 
     // do smth to the person :) 
    } 
} 

Я рекомендую прочитать книгу this для получения более подробной информации о Dependency Injection дизайн шаблона.

+0

Спасибо. Просто отредактировал мой ответ в соответствии с вашими рекомендациями. Я добавил интерфейс для PersonRepository, но должен ли я добавить интерфейс для PersonRepositoryFactory? Какую выгоду он предоставит, когда я могу уже переключиться на хранилище XML или SQl ... – user2645830

+0

Я бы не стал использовать заводскую фабрику. Я бы использовал контейнер зависимости, чтобы связать вещи вместе. Если вы не хотите использовать библиотеки DI, я все равно буду обертывать репозиторий в интерфейс, чтобы было легче проверить все, что связано с этой фабрикой. – SOReader

Смежные вопросы