Проблемы с фабриками C # - PullRequest
       10

Проблемы с фабриками C #

0 голосов
/ 12 октября 2011

Итак, я работал над некоторыми проблемами, и я очень близок, но я столкнулся с проблемой.

Вот как я называю свою фабрику:

ClassImporter classImporter = new ClassImporter(importOptions);

Существует несколько типов ClassImporter объектов, вот базовый класс ClassImporter с одним из типов.

public class ClassImporter
    {
        public ImportOptions Options;
        public ClassImporter Importer;

        public ClassImporter()
        {

        }

        public ClassImporter(ImportOptions options)
        {
            this.Options = options;
            this.Importer = ClassImporterFactory.GetImporter(options);
        }

        public virtual List<Class> Import()
        {
            return Importer.Import();
        }
    }

public class ExcelImporter : ClassImporter, IClassImporter
    {
        public ExcelImporter() : base()
        {

        }

        public override List<Class> Import()
        {
            if (base.Options.FileLocation == string.Empty)
            {
                throw new BlankFilenameException("A blank Excel file location was supplied.");
            }
            return new List<Class>();
        }
    }

И вот этот Factory класс, который вы видите там:

public class ClassImporterFactory
    {
        public static ClassImporter GetImporter(ImportOptions options)
        {
            switch (options.FileType)
            {
                case FileType.CSV:
                    return new CSVImporter(options);
                case FileType.Excel:
                    return new ExcelImporter();
                case FileType.MySQL:
                    return new MySQLImporter(options);
                case FileType.Oracle:
                    return new OracleImporter(options);
                case FileType.ScreenScraper:
                    return new ScreenScraperImporter(options);
                case FileType.SQL:
                    return new SQLImporter(options);
                case FileType.XML:
                    return new XMLImporter(options);
                case FileType.NotSet:
                default:
                    throw new BlankImportTypeException("Import type was not specified in the Import Options.");

            }
        }
    }

Теперь я пытаюсь Assert на том Exception, который вы видите в классе ExcelImporter, с такой строкой:

classImporter.Import();

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

Как я могу повторить это?

РЕДАКТИРОВАТЬ: Полный тест:

[TestMethod]
        [ExpectedException(typeof(BlankFilenameException), "A blank Excel file location was supplied.")]
        public void LoadExcelFile_EmptyName_ReturnsBlankFilenameException()
        {
            ImportOptions importOptions = new ImportOptions(FileType.Excel, string.Empty);
            ClassImporter classImporter = new ClassImporter(importOptions);

            classImporter.Import();
        }

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

Вы получаете NullReferenceException, не так ли?

Когда вы делаете это:

public ExcelImporter() : base() {}

вы не передаете ImportOptions базовому классу. Поэтому его нельзя установить, поэтому в строке, где вы проверяете опции, base.Options всегда будет нулевым.

(Но этот дизайн выглядит так, как будто он должен зацикливаться навсегда при создании ClassImporter, поэтому мне неясно, чего вы пытаетесь достичь)

1 голос
/ 12 октября 2011

ExcelImporter - единственный из ваших классов, для которого вы используете конструктор по умолчанию.Поэтому он никогда не устанавливает поле «Параметры».Базовый конструктор без параметров также не устанавливает его.Итак, в основном вы создаете экземпляр ClassImporter с правильными параметрами и устанавливаете его свойство Importer на новый экземпляр ExcelImporter без параметров.

Вы можете исправить это несколькими способами, но самый простой способ - заставить ExcelImporter работать так же, как другие подклассы, и иметь конструктор, который принимает ImportOptions.Затем вызовите этот конструктор из GetImporter.Но не связывайте их в цепочку - это зациклится навсегда.

Действительно, я не понимаю, почему ExcelImporter является производным классом ClassImporter.Он не использует никаких функций ClassImporter, и вы настраиваете себя на бесконечный цикл с конструкторами.Просто дайте ему варианты при создании экземпляра.

...