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

标签 c# unit-testing out

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

TryParse 的使用是 TypeConverter 过程的一部分,如 WebAPI Parameter Binding post By 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);
    }
}

最佳答案

就个人而言,我会使用 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 参数的方式。

关于c# - 如何使用 'out' 参数测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970265/

相关文章:

c# - Nlog 日志记录方法

android - 如何在 Android 中使用单元测试或仪器测试来测试警报管理器

c# - 如何调试这个或可能的原因? Moq.Verify 上的用户代码未处理 System.NullReferenceException

Android比较出wrap_content和match_parent

c# - 每次调用最小起订量时,模拟方法输出不同的输出参数

c# - 为什么 C# 出的泛型类型参数会违反协变?

c# - 如何在单击按钮时检查是否在数据网格中选中了复选框

c# - 索引 0 为负数或高于行数

c# - Naudio,如何判断播放完成

unit-testing - Grails 1.3.7 Spock中的失败单元测试