如何使用'out'参数测试方法?

Ita*_*nex 4 c# unit-testing out

我正在尝试为具有参数的方法编写单元测试.我的方法特别是我的自定义对象的TryParse方法.我在Visual Studio 2013中使用.NET 4.5/5.这使我可以使用PrivateType对象完全实现私有/内部和静态对象.似乎逃避我的一件事是如何测试out参数,因为我不能在InvokeStatic方法中使用this关键字.我正在寻找适当的解决方案来测试这种架构设计.

TryParse的使用是TypeConverter进程的一部分,如WebAPI参数绑定帖子中所述.作者:Mike Wilson

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

就个人而言,我使用的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]);
Run Code Online (Sandbox Code Playgroud)

至少,我希望这可以工作 - 这就是反射通常如何处理ref和out参数.