log98 Ответов: 2

Конструктор по типу не найден ошибка в privateobject


Я пишу модульный тест для расчета software.in тестовый случай я использовал "PrivateObject "для доступа к закрытому методу" sendNumberToCalculation ()", но я получаю конструктор ошибок по типу не найден.

 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);
    }
}


Что я уже пробовал:

я получаю конструктор ошибок по типу не найден, и я хочу исправить эту ошибку.

2 Ответов

Рейтинг:
2

Kadau _

Не могли бы мы сделать скриншот ошибки и строки, пожалуйста ?


Richard Deeming

Если у вас есть вопрос или комментарий, нажмите кнопку "есть вопрос или комментарий?" кнопка под вопросом.

Не публикуйте свой комментарий в качестве решения.

Рейтинг:
14

Richard Deeming

Ваш Calculation класс не содержит конструктора без параметров. Вам нужно передать параметры конструктора то PrivateObject конструктор[^]:

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

Вы также пытаетесь вызвать sendNumberToCalculation метод с одним параметром PolishNotation тип, но этот метод не имеет никаких параметров. Вам нужно удалить второй аргумент из Invoke вызов:
double actual = Convert.ToDouble(obj.Invoke("sendNumberToCalculation"));


log98

Ричард, большое спасибо, не могли бы вы объяснить немного подробнее? на самом деле я не знаю о new[] typeof(string) и new[] { expression} .

Richard Deeming

Это неявно типизированные инициализаторы массивов.

Вы также можете написать их как new Type[1] { typeof(string) } и new object[1] { expression }.

Или действительно многословный вариант:
Type[] parameterTypes = new Type[1];
parameterTypes[0] = typeof(string);
object[] parameterValues = new object[1];
parameterValues[0] = expression;
PrivateObject obj = new PrivateObject(typeof(Calculation), parameterTypes, parameterValues);



(Технически, new[] { expression } создает новый массив строк, а не массив объектов. Но массивы являются ковариантными[^], так что это все еще работает.)