2016-08-02 5 views
3

Ich schreibe einen Komponententest für Berechnung software.in Testfall ich verwendet von "PrivateObject" für den Zugriff auf private Methode "sendNumberToCalculation()", aber ich bekomme Fehler Konstruktor auf Typ nicht gefunden.Konstruktor auf Typ nicht gefunden Fehler in PrivateObject

public class CalculationTest 
{ 
    [TestMethod] 
    public void sendNumberToCalculationTest() 
    { 

     // -- Act 
     PrivateObject obj = new PrivateObject(typeof(Calculation)); 
     Tokenization token = new Tokenization("5*10-18/(3+19)"); 
     PolishNotation polish = new PolishNotation(token.MathExpressionParser()); 

     double expected = 49.19; 

     // -- Actual 
     double actual = Convert.ToDouble(obj.Invoke("sendNumberToCalculation", polish)); 

     // -- Assert 
     Assert.AreEqual(expected, actual); 
    } 
} 

    public class Calculation 
{ 

    private Tokenization token; 

    private PolishNotation polish; 
    private Stack<double> numbers = new Stack<double>(); 
    private Stack<string> operators = new Stack<string>(); 

    public Calculation(string expression) 
    { 
     token = new Tokenization(expression); 
     polish = new PolishNotation(token.MathExpressionParser()); 
    } 

    private double sendNumberToCalculation() 
    { 
     int number; 
     int number1 = 0; 
     int number2 = 0; 
     string operatorName = ""; 
     int counter = 1; 
     foreach (var item in polish.InfixToPostfix()) 
     { 
      numbers.Push(Convert.ToDouble(item)); 
      if (!int.TryParse(item, out number)) 
      { 
       operators.Push(item); 
       while (counter <= 2 && numbers.Count > 1) 
       { 
        if (counter == 1) 
        { 
         number2 = Convert.ToInt32(numbers.Pop()); 
        } 
        else if (counter == 2 && operators.Count > 0) 
        { 
         number1 = Convert.ToInt32(numbers.Pop()); 
         operatorName = operators.Pop(); 
        } 
       } 
      } 
      operatorDetect(number1, number2, operatorName); 
     } 
     var result = numbers.Pop(); 

     return result; 
    } 

    private void operatorDetect(int number1, int number2, string operatorName) 
    { 
     switch (operatorName) 
     { 
      case "+": 
       Add(number1, number2); 
       break; 

      case "*": 
       Multipy(number1, number2); 
       break; 

      case "/": 
       Divide(number1, number2); 
       break; 

      case "-": 
       Subtract(number1, number2); 
       break; 
     } 
    } 

    private void Add(int number1, int number2) 
    { 
     double number = number1 + number2; 
     numbers.Push(number); 
    } 

    private void Multipy(int number1, int number2) 
    { 
     double number = number1 * number2; 
     numbers.Push(number); 
    } 

    private void Subtract(int number1, int number2) 
    { 
     double number = number1/number2; 
     numbers.Push(number); 
    } 

    private void Divide(int number1, int number2) 
    { 
     double number = number1 - number2; 
     numbers.Push(number); 
    } 
} 
+0

möglicherweise helfen http://stackoverflow.com/questions/135443/how-doi-i-use-reflection-to-invoke-a-private-method – Vladimir

Antwort

2

Die Berechnungsklasse enthält keinen parameterlosen Konstruktor. Den Konstruktor Parameter the PrivateObject constructor:

string expression = "5*10-18/(3+19)"; 

PrivateObject obj = new PrivateObject(
    typeof(Calculation),  // The type of the object to create 
    new[] { typeof(string) }, // The type of each parameter 
    new[] { expression }); // The value for each parameter 

die sendNumberToCalculation Methode mit einem Parameter des Polnischen Notation Typs passieren aufzurufen, aber das Verfahren hat keine Parameter. das zweite Argument aus dem Invoke Aufruf zu entfernen:

double actual = Convert.ToDouble(obj.Invoke("sendNumberToCalculation")); 
0

Es ist ein einfacher Weg, dies zu erreichen, erstellen Sie einfach das Objekt zuerst und dann die PrivateObject Konstruktor aufrufen, die ein Objekt anstelle eines Typs nimmt.

Verwandte Themen