2016-08-02 8 views
3

개인용 메서드 "sendNumberToCalculation()"에 액세스하기 위해 "PrivateObject"에 사용 된 계산 software.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

도움이 될 수 있습니다. http://stackoverflow.com/questions/135443/how-do-i-use-reflection-to-invoke-a-private-method – Vladimir

답변

2

계산 클래스에 매개 변수없는 생성자가 없습니다. 폴란드 표기법 유형의 하나 개의 파라미터로 sendNumberToCalculation 메소드를 호출 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 

생성자 파라미터를 전달할 수 있지만,이 방법은 임의의 파라미터가 없다. 인보 호출에서 두 번째 인수를 제거 :

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

이를 달성하기 쉬운 방법이 간단하게 먼저 객체를 만든 다음 형식 대신 객체를 취하는 PrivateObject 생성자를 호출합니다.

관련 문제