【问题标题】:The type or namespace name 'PrivateObject' could not be found找不到类型或命名空间名称“PrivateObject”
【发布时间】:2018-11-13 03:11:30
【问题描述】:

我正在使用 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”

我查找了文章和教程,但我仍然不知道我做错了什么。

【问题讨论】:

标签: c# unit-testing


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    正如@Tim 所提到的,它不包含在.net core 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);
        }
    }
    

    我已经在几个单元测试中尝试过,对我来说效果很好,如果我发现问题我会更新。

    【讨论】:

      【解决方案3】:

      如果您将鼠标悬停在 PrivateObject( 上并右键单击.. 是否有转到定义的选项?

      该命令会告诉你它认为该类是什么..

      如果您无法通过上下文菜单进行定义,则意味着您缺少引用并且编译器不知道 PrivateObject 是什么..

      如果是这种情况,您可以通过 NuGet 包管理器或右键单击项目并转到添加引用来添加对它的引用。

      还记得使用 using 语句将命名空间添加到文件的顶部,一旦这些都到位,它应该知道该对象是什么。 此时您应该不会收到任何错误,您的 Go to Definition 上下文菜单应该会将您带到实际的类定义。

      【讨论】:

        【解决方案4】:

        虽然PrivateObjectTestMethodAttribute 和相关属性共享相同的Microsoft.VisualStudio.TestTools.UnitTesting 命名空间,但它属于单独的程序集

        Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll
        

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

        您还需要转换结果,因为Invoke 返回一个object

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-12
          • 2011-05-13
          • 2013-03-25
          • 2012-06-19
          • 2017-11-29
          • 2012-09-27
          • 2011-05-06
          相关资源
          最近更新 更多