了解MVP模式的测试驱动方法?

时间:2014-01-07 11:03:50

标签: c# asp.net design-patterns mvp

我正在学习MVP,测试驱动方法和工厂模式。我想写几个简单的类来维护一个人的数据和存储库。该人的数据将存储在sql中并在xml中进行测试。我读到了关于StructureMap但不想使用它而是想要使用一个简单的工厂实现,最终可以帮助我在单元测试用例中挂钩。这是我的课程:

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);
    }
}

请告诉我,我采取的方法是正确的还是其他任何建议。此外,由于我没有在构造函数中传递对象,这不能作为依赖注入的示例吗?

1 个答案:

答案 0 :(得分: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书,了解有关依赖注入设计模式的更多详细信息。