2008-12-08 21 views
13

Ben harici bir yardımcı programın iki örneğini yönetecek bir uygulama oluşturma veri ve getiriliyor sonuçlarla her ihracatçı duyuyorum. Ders için birim testleri yazıyorum olarakTest Süreci. Başlatma?

Ama bir problem üzerine geldi.

nasıl hedef yöntemi aslında denilen (bir özellik aracılığıyla ayarlanır) bir süreç başlar testi yapmak?

denedim:

  • sınıf harici sürecini yürütmek ve sonra başlamıştır olmadığını kontrol etmek GetProcessesByName kullanmaya dikkat edin.
  • kullanımı çıkış yönlendirme, ör bir dosyaya bir şey eklemek ve varoluşunu test etmek için daha büyük bir işareti kullanma

Kod yazmak ve/veya test yapmak için başka bir exe oluşturmak gibi hissediyorum.

public void Start() 
{ 
    if (!_isRunning) { 
     var startInfo = new ProcessStartInfo() { 
      CreateNoWindow = true, 
      UseShellExecute = true, 

      FileName = _cmdLine, 
      Arguments = _args 
     }; 

     _process = Process.Start(startInfo); 
     _isRunning = true; 

    } else { 
     throw new InvalidOperationException("Process already started"); 

    } 
} 

istediğim birim test hiçbir şey çalışıyorsa (_isRunning == false), yeni bir süreç çatallanabilir gerektiğini böylece:

Bu kesin yöntemdir.

stumped hissediyorum, harici süreç aslında başladığı birim test zarif bir yolu var mı?

cevap

10

Bu bağımlılık enjeksiyon kullanılarak ve sahte ya da sahte sınıfını yaklaşacağını söyledi. Not Sınıf yöntemi yerine başlangıç ​​için örnek yöntemini kullanıyorum. Düzenli kodunuzda, varsayılan yapıcıyı kullanabilir ve sizin için bir süreç yaratabilirsiniz. Test için sahte veya sahte bir işlem enjekte edebilir ve sadece sahte nesneye uygun yöntemlerin çağrıldığını kontrol edin ve hiçbir zaman gerçekten bir işlem başlatmaya gerek yoktur. Benim ihmal ettiğim özellikleri dikkate almak için bunu ayarlamanız gerekecek. Ör. Aşağıda:

public class UtilityManager 
{ 
     public Process UtilityProcess { get; private set; } 

     private bool _isRunning; 

     public UtilityManager() : this(null) {} 

     public UtilityManager(Process process) 
     { 
      this. UtilityProcess = process ?? new Process(); 
      this._isRunning = false; 
     } 

     public void Start() 
     { 
      if (!_isRunning) { 
      var startInfo = new ProcessStartInfo() { 
       CreateNoWindow = true, 
       UseShellExecute = true, 

       FileName = _cmdLine, 
       Arguments = _args 
      }; 

      this.UtilityProcess.Start(startInfo); 
      _isRunning = true; 

     } else { 
      throw new InvalidOperationException("Process already started"); 
     } 
} 

Testi kodu ...

[TestMethod] 
public void StartTest() 
{ 
     Process proc = new FakeProcess(); // May need to use a wrapper class 
     UtilityManager manager = new UtilityManager(proc); 
     manager.CommandLine = "command"; 
     ... 

     manager.Start(); 


     Assert.IsTrue(proc.StartCalled); 
     Assert.IsNotNull(proc.StartInfo); 
     Assert.AreEqual("command", proc.StartInfo.FileName); 
     ... 
} 
+0

Güzel ... Biraz daha ... alay etrafında Teşekkür Kafamı ... startinfo ayırma parçasını var gözardı! – chakrit

+0

Daha kısa kod için 'public UtilityManager(): this (null) {} public UtilityManager (İşlem süreci)' nü “public UtilityManager” (Process process = null) 'olarak değiştirebilirsiniz. – Bomberlt

+0

@Bomberlt Yansıma yoluyla erişen araçların kullanabileceği bir varsayılan kurucunun mevcut olmasını istemiyorum. – tvanfosson