2011-10-11 64 views
0

所以我一直在解決一些問題,而且我非常接近,但是我遇到了一個問題。C#工廠問題

因此,這裏是我怎麼稱呼我廠:

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."); 

      } 
     } 
    } 

現在我想AssertException您在ExcelImporter類看,這條線:

classImporter.Import(); 

我的測試歸因於有一個ExpectedException,但它看起來像當我通過它進行調試時,導入器託管在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(); 
     } 
+0

我不明白你在說什麼的問題;也許你可以發佈測試代碼? – CodingGorilla

+0

發佈測試 – slandau

+0

IMO你要問工廠對象ClassImporterFactory爲你創建實例ClassImporter,並不允許直接創建特別是與選擇的事情ClassImporters。 – kenny

回答

1

ExcelImporter的只有你的類,你是一個使用默認的構造函數。所以它從不設置選項字段。無參數的基礎構造函數也沒有設置它。 因此,基本上,您使用正確的選項創建ClassImporter實例,並將其Importer屬性設置爲不帶任何選項的新ExcelImporter實例。

您可以有幾種方法解決這個問題,但最簡單的方法就是讓ExcelImporter工作與您的其他子類,並有一個構造函數ImportOptions。然後從GetImporter調用該構造函數。不要連鎖他們 - 這將永遠循環。

真的,我不明白爲什麼ExcelImporter是一個派生類ClassImporter的。它不使用任何的ClassImporter的功能,你就把自己與構造一個無限循環。只要在製作實例時給它選項。

2

你得到一個NullReferenceException,不是嗎?

當你這樣做:

public ExcelImporter() : base() {} 

你不傳遞任何ImportOptions基類。所以它永遠不會被設置,因此在您檢查選項的行中,base.Options將始終爲空。

(不過這個設計看起來像它應該永遠非常循環當你創建一個ClassImporter,所以我對你想要什麼來完成不清)