找不到类型或名称空间名称“ PrivateObject”

时间:2018-11-13 03:11:31

标签: c# unit-testing

我正在使用Visual Studio 2017,并且试图在C#中创建私有方法的单元测试(下面的代码):

[TestClass]
public class CalculatorTests
{
    [TestMethod]
    public void TestCalculator_Hello()
    {
        var calc = new Calculator(1);

        var privateObject = new PrivateObject(calc);

        string expected = "hello!";

        string result = privateObject.Invoke("HelloTest");
        Assert.AreEqual(expected, result);
    }


}

但是,我收到此错误消息:

  

错误CS0246找不到类型或名称空间名称'PrivateObject'

我一直在寻找文章和教程,但我仍然不知道自己在做什么错。

4 个答案:

答案 0 :(得分:1)

PrivateObject和PrivateType不适用于面向netcoreapp2.0的项目。这里有一个GitHub问题: GitHub Issue 366

一种选择是从类继承,然后在继承的类中公开该方法。

答案 1 :(得分:0)

PrivateObjectMicrosoft.VisualStudio.TestTools.UnitTesting共享相同的TestMethodAttribute名称空间并具有相关的属性,但它属于单独的程序集

Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll

检查并确保测试项目引用了程序集。

您还需要强制转换结果,因为Invoke返回了object

string result = (string)privateObject.Invoke("HelloTest");

答案 2 :(得分:0)

如果将鼠标悬停在PrivateObject(上,然后单击鼠标右键。。是否有转到定义的选项?

该命令将告诉您它认为该类是什么。

如果无法通过上下文菜单进入定义,则表示您缺少引用,并且编译器不知道什么是PrivateObject。

在这种情况下,您可以通过NuGet软件包管理器或通过右键单击项目并转到“添加引用”来添加对其的引用。

还要记住,使用using语句将命名空间添加到文件顶部,一旦所有这些都放置到位,它就应该知道该对象是什么。 此时,您应该不会出现任何错误,并且“转到定义”上下文菜单应将您带到实际的类定义。

答案 3 :(得分:0)

正如@Tim所提到的,.net核心https://github.com/Microsoft/testfx/issues/366中不包含它,但是如果您遵循该线程,则可以找到对https://gist.github.com/skalinets/1c4e5dbb4e86bd72bf491675901de5ad的引用,其中包含“穷人专用方法实现”以确保完整性。代码复制到下面

public class PrivateObject
{
    private readonly object o;

    public PrivateObject(object o)
    {
        this.o = o;
    }

    public object Invoke(string methodName, params object[] args)
    {
        var methodInfo = o.GetType().GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
        if (methodInfo == null)
        {
            throw new Exception($"Method'{methodName}' not found is class '{o.GetType()}'");
        }
        return methodInfo.Invoke(o, args);
    }
}

我已经在一些单元测试中进行了尝试,并且对我来说还算不错,如果发现问题,我会进行更新。