c# - 在 PrivateObject 中找不到类型的构造函数错误

标签 c# unit-testing

我正在为计算软件编写单元测试。在测试用例中,我使用“PrivateObject”来访问私有(private)方法“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);
    }
}

最佳答案

计算类不包含无参数构造函数。将构造函数参数传递给 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

使用一个 PolishNotation 类型的参数调用 sendNumberToCalculation 方法,但该方法没有任何参数。从 Invoke 调用中删除第二个参数:

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

关于c# - 在 PrivateObject 中找不到类型的构造函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38722905/

相关文章:

c# - 使用 Team City 构建 ASP MVC 解决方案时出错

c# - 提供字符串字段时如何正确实现 IWebPartField.Schema

c# - Entity Framework 不适用于时态表

java - 为什么这个 Mockito.mock 对象被调用而不是被模拟?

c# - ASP.NET 动态命令按钮仅每隔一次触发

C# facebook graph/如何上传到相册id

python - Python的模拟库,在模拟函数中只返回一次值?

python - 测试和模拟使用 async with 语句的异步代码

perl - 如何测试生成随机数的方法是否生成随机数

java - 如何使用 JRuby 和 Mocha 模拟静态 Java 方法?