C# 如何使用'测试方法;输出';参数?
我试图为一个没有参数的方法编写一个单元测试。我的方法是一个专门用于自定义对象的TryParse方法。我正在Visual Studio 2013中使用.NET 4.5/5。这允许我使用PrivateType对象完全实现私有/内部和静态对象。有一件事似乎让我无法理解,那就是如何测试out参数,因为我不能在InvokeStatic方法中使用这个关键字。我正在寻找合适的解决方案来测试这种架构设计 TryParse的使用是TypeConverter过程的一部分,如中所述C# 如何使用'测试方法;输出';参数?,c#,unit-testing,out,C#,Unit Testing,Out,我试图为一个没有参数的方法编写一个单元测试。我的方法是一个专门用于自定义对象的TryParse方法。我正在Visual Studio 2013中使用.NET 4.5/5。这允许我使用PrivateType对象完全实现私有/内部和静态对象。有一件事似乎让我无法理解,那就是如何测试out参数,因为我不能在InvokeStatic方法中使用这个关键字。我正在寻找合适的解决方案来测试这种架构设计 TryParse的使用是TypeConverter过程的一部分,如中所述 就我个人而言,我会使用Intern
就我个人而言,我会使用
InternalsVisibleTo
以使方法对测试代码可见,但如果您确实想使用PrivateType
,我希望您能够创建一个对象[]
,并保留对该对象的引用,将其传递到InvokeStatic
,然后再次获取值:
object[] args = new object[] { stringSource, null };
var tryParseReturn = target.InvokeStatic("TryParse", args);
...
// args[1] will have the value assigned to the out parameter
Assert.AreEqual(expectedOut, args[1]);
至少,我认为这是可行的——反射通常就是这样处理ref和out参数的。而TryParse必须是内部的?因为架构设计是限制对外部不需要的属性的访问(关注点分离)。这迫使我们的开发人员在处理数据对象时使用正确的编码模式。
args
没有传递给InvokeStatic
,或者我遗漏了什么?@haim770 InvokeStatic有几个接口,我在这个场景中尝试使用的接口在这里有文档记录@谢谢,这其实是我应该做的。我全神贯注于以这种方式测试所有其他静态进程,我忘记了我可以为“内部”进程这样做,以便与其他程序集“交朋友”@JonSkeet@haim770是的,Jon Skeet的解决方案有效。我没有IComparer,所以我必须显式地计算Assert.IsEqual(预期的,实际的),但是其他测试现在正在运行。
object[] args = new object[] { stringSource, null };
var tryParseReturn = target.InvokeStatic("TryParse", args);
...
// args[1] will have the value assigned to the out parameter
Assert.AreEqual(expectedOut, args[1]);