我正在使用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'
我一直在寻找文章和教程,但我仍然不知道自己在做什么错。
答案 0 :(得分:1)
PrivateObject和PrivateType不适用于面向netcoreapp2.0的项目。这里有一个GitHub问题: GitHub Issue 366
一种选择是从类继承,然后在继承的类中公开该方法。
答案 1 :(得分:0)
PrivateObject
与Microsoft.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);
}
}
我已经在一些单元测试中进行了尝试,并且对我来说还算不错,如果发现问题,我会进行更新。