Это хороший или плохой способ использовать конструктор цепочки? (... чтобы разрешить для тестирования) - PullRequest
6 голосов
/ 24 марта 2010

Моя мотивация для создания цепочек моих конструкторов классов заключается в том, что у меня есть конструктор по умолчанию для основного использования моим приложением, и второй, который позволяет мне вводить макет и заглушку.

Это просто кажется немного уродливыми "новыми" вещами в вызове ": this (...)" и нелогичным вызовом параметризованного конструктора из конструктора по умолчанию, я задавался вопросом, что другие люди будут делать здесь?

(FYI -> SystemWrapper )

using SystemWrapper;

public class MyDirectoryWorker{

    //  SystemWrapper interface allows for stub of sealed .Net class.
    private IDirectoryInfoWrap dirInf;

    private FileSystemWatcher watcher;

    public MyDirectoryWorker()
        : this(
        new DirectoryInfoWrap(new DirectoryInfo(MyDirPath)),
        new FileSystemWatcher()) { }


    public MyDirectoryWorker(IDirectoryInfoWrap dirInf, FileSystemWatcher watcher)
    {
        this.dirInf = dirInf;
        if(!dirInf.Exists){
            dirInf.Create();
        }

        this.watcher = watcher;

        watcher.Path = dirInf.FullName;

        watcher.NotifyFilter = NotifyFilters.FileName;
        watcher.Created += new FileSystemEventHandler(watcher_Created);
        watcher.Deleted += new FileSystemEventHandler(watcher_Deleted);
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.EnableRaisingEvents = true;
    }

    public static string MyDirPath{get{return Settings.Default.MyDefaultDirPath;}}

    // etc...
}

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

Включение конструктора по умолчанию является запахом кода, поскольку теперь класс связан с конкретной реализацией IDirectoryInfoWrap. Чтобы упростить свою жизнь, используйте контейнер IOC, внешний по отношению к классу, для внедрения различных зависимостей в зависимости от того, выполняете ли вы тестовый код или основное приложение.

0 голосов
/ 24 марта 2010

Вот как я это делаю.

class MyUnitTestableClass
{
    public MyUnitTestableClass(IMockable foo)
    {
        // do stuff
    }

    public MyUnitTestableClass()
        : this(new DefaultImplementation())
    {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...