我正在尝试为具有参数的方法编写单元测试。我的方法特别是我的自定义对象的TryParse方法。我在Visual Studio 2013中使用.NET 4.5 / 5.这使我可以使用PrivateType对象完全实现私有/内部和静态对象。似乎逃避我的一件事是如何测试out参数,因为我不能在InvokeStatic方法中使用this关键字。我正在寻找合适的解决方案来测试这种架构设计。
TryParse的使用是WebAPI Parameter Binding post By Mike Wilson
中概述的TypeConverter流程的一部分public class MyFilter
{
public string Field { get; set; }
//... removed for brevity
internal static bool TryParse(string sourceValue, out MyFilter filter)
{
//... removed for brevity
}
}
public class MyFilterTests
{
[TestMethod]
[TestCategory("TryParse")]
public void TryParseWithTitleOnly()
{
var stringSource = "{field:'DATE.FIELD'}";
MyFilter tryParseOut = null;
var target = new PrivateType(typeof(MyFilter));
var tryParseReturn = target.InvokeStatic("TryParse", stringSource, tryParseOut);
var expectedOut = new MyFilter()
{
Field = "DATE.FIELD"
};
Assert.IsTrue((bool)tryParseReturn);
Assert.AreEqual(expectedOut, tryParseOut);
}
}
答案 0 :(得分:9)
就我个人而言,我使用InternalsVisibleTo
以使该方法对您的测试代码可见,但如果您 想要使用PrivateType
,我会期待您只需创建一个引用的object[]
,将其传递给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参数。