我正在尝试为具有参数的方法编写单元测试。我的方法具体来说是我的自定义对象的 TryParse 方法。我正在使用 .NET 4.5/5 和 Visual Studio 2013。这使我能够使用 PrivateType 对象完全实现私有/内部和静态对象。我似乎忽略的一件事是如何测试 out 参数,因为我无法在 InvokeStatic 方法中使用此关键字。我正在寻找合适的解决方案来测试这种架构设计。
TryParse 的使用是 TypeConverter 过程的一部分,如WebAPI 参数绑定帖子 作者:Mike Wilson http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
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);
}
}
就我个人而言,我会使用InternalsVisibleTo
为了使该方法对您的测试代码可见,但是如果您do想要使用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]);
至少,我会expect工作 - 这就是反射通常处理 ref 和 out 参数的方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)