2017-08-08 2 views
0

Ich muss die private Methode CheckWarehouseAvailability in einer abstrakten Klasse testen.Komponententest C# für private Methode

public abstract class BaseAPI 
{ 
    private void CheckWarehouseAvailability(Order order) 
    { 
     //codes here 
    } 
} 

public class Processor : BaseAPI 
{ 

} 

Hier mein Testmethod ist

Processor pro = new Processor(); 
PrivateObject privBase = new PrivateObject(pro, new PrivateType(typeof(BaseAPI))); 
var retVal = privBase.Invoke("CheckWarehouseAvailability(order)"); 
Assert.AreEqual(true, retVal); 

Wenn ich die Testmethode laufen, habe ich diesen Fehler: An exception of type 'System.MissingMethodException' occured in mscorlib.dll but was not handled in user code

+2

Das Argument

MethodInfo methodName = privBase.GetType().GetMethod("ShowGrid", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 

dann rufen Sie die Methode bekommen ('order') muss vor dem Aufruf aufgebaut und weitergegeben als ein zusätzliches Argument zu "Invoke". Wie Sie gerade schreiben, versuchen Sie, eine Methode aufzurufen, die als Teil ihres Namens die Zeichenfolge "(order)" enthält. – dlatikay

Antwort

3

Sie müssen die Order Argument von CheckWarehouseAvailability und geben es als Argument instanziiert zu PrivateObject.Invoke():

var order = new Order(); 
var retVal = privBase.Invoke("CheckWarehouseAvailability", order); 
// ... Assert 

MSDN: PrivateObject.Invoke(String, Object[])

Auch ich bin nicht sicher, was Sie behaupten hier:

Assert.AreEqual(true, retVal); 

... als CheckWarehouseAvailability es Rückgabetyp zu void gesetzt hat, nicht bool.

1

Zuerst müssen Sie die Methode über Reflektion mit params

var retVal=methodName .Invoke(privBase, order); 
Verwandte Themen