2010-08-20 20 views
5

Form Denetimi'nde açılacak Infopath Formları'nı test etmek için test yapıyorum, test yöntemimSystem.TypeInitializationException

[TestMethod] 
public void Validate_OpenInfopathInFormControl() 
{ 
    Helper.OpenForm(); 
    //Other Code  
} 

public class Helper 
{ 
    public static void OpenForm() 
    { 
     //Code to Open Form 
    } 
} 

Yardımcısını yazdım. Ama bu kodu çalıştırdığım her zaman :

Test metodu InfoPathTest.TestAPI.Validate_OpenInfopathInFormControl istisnayı attı: System.TypeInitializationException: 'ın InfoPathTest.Helpers.Helper' için tür başlatıcı bir istisnası attı. ---> System.NullReferenceException: başvurusu nesnesinin bir örneğine ayarlanmadı.

Hata ayıklamaya çalıştığımda, Helper sınıfının başlatılması gerektiğinde başarısız oluyor. Bu gerçekten kafamı yiyor, bunun için bir çözüm var mı?

İşte tam yardımcı sınıftır:

namespace InfoPathTest.Helpers 
{ 
    public class Helper 
    { 
    //This is the form i need to OPEN 
     private static MainForm f = new MainForm(); 
     private static bool _isOpen = false; 

     public static bool isOpen 
     { 
      set { _isOpen = value; } 
      get { return _isOpen; } 
     } 

     public static void OpenForm() 
     { 
      try 
      { 
       f.Show(); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
      _isOpen = true; 

     } 

     public static void CloseForm() 
     { 
      f.Hide(); 
     } 
    } 
} 
+0

Yardımcı sınıfı yapıcı ve değişkenler ile yapıştırabilir misiniz? –

+0

Yardımcı sınıfınızda ('public static Helper()') statik yapıcıda hangi kodun olduğunu bize göstermeniz gerekecek. Bu, yukarıda güncellenmiş olan istisna – Rob

+0

'a neden olan bir şey. –

cevap

6

Testiniz Helper.OpenForm() çağırır ve hiçbir statik yapıcı olduğu gibi, tek şey görebilir bu istisnanın atılmasına neden olacak olan: MainForm kurucularında

private static MainForm f = new MainForm(); 

nedenle bir şey muhtemelen istisna atıyor. MainForm için kurucunun ilk hattında bir kesme noktası koyun ve istisnanın nereye atıldığını görene kadar devam edin. Eğer daha kolay sorun bunu adım adım yeni bir testi yazarak, en azından başlangıçta, ne olduğunu tespit etmek bulabilir Alternatif

doğrudan new MainForm() çağırır:

[TestMethod] 
public void Validate_OpenInfopathInFormControl() 
{ 
    var form = new MainForm(); 
} 

tek satırda kesme noktası koy Test ve neden bir NullReferenceException atıyor belirlemek için kurucuya adım.

+0

Teşekkürler, evet haklısınız. MainForm için kurucuda bir sorun var ve ben bunun içinde çalışıyorum! –

1

Sen statik yapıcı bir hata var (bunlar Tip başlatıcıları denir):

İşte tam yardımcı sınıftır. İç istisna bir NullReference istisnasıdır. Kodunuzu gönderirseniz size yardımcı olabiliriz.

Kurallar, başlatıcıların çalıştırılmasının ne zaman karmaşık olduğunu belirler, ancak türüne herhangi bir şekilde erişmeden önce bunların çalıştırılacağı garanti edilir. Eğer örtülü başlatma kullanabilirsiniz çünkü sizin Helper sınıfı bir tür başlatıcısı olduğunu doğrudan size apaçık olmayabilir:

public class Helper 
{ 
    static int i = 10; // This assignment will end up in a type initializer 
    static Helper() 
    { 
     // Explicit type initializer 
     // The compiler will make sure both, implicit and explicit initializations are run 
    } 
} 
+0

Yukarıda güncelledim. Statik kurucuda –

+0

kod yok. Bunun geldiğini biliyordum :-) Bu yorumu görmeden önce genişlemeye başladım. Umarım şeyleri temizler. –

3

Başlatıcı türü, bu durumda, statik alanlarınızın başlatıldığı yerdir; Yani, bu iki satır:

private static MainForm f = new MainForm(); 
private static bool _isOpen = false; 

bir bool paraflarlar istisna her türlü neden gitmiyor, bu nedenle hata kaynağı MainForm yapıcı olduğunu son derece olasıdır.

TypeInitializationException nesnesi iç istisnalar içeriyor mu? Eğer öyleyse, hatanın gerçek nedeni hakkında size daha fazla bilgi vermeliler.