繁体   English   中英

单元测试在预期的InvalidOperationException上失败

[英]Unit Test fails on expected InvalidOperationException

我已经编写了单元测试来测试应用程序中的一些SQL操作。 这是测试:

[TestMethod]
[ExpectedExceptionAttribute(typeof(InvalidOperationException))]
public void ExecuteSQL_CommandInvalidSyntax_ThrowsException()
{
    var result = TestSqlHandler.ExecuteSQL(new List<int>
    {
        1, 2, 3, 4
    }, "Invalid command text");
}

有问题的方法:

public static Exception ExecuteSQL(List<int> walletList, string command)
{
    try
    {
        using (var conn = new SqlConnection("Omitted"))
        {
            if (conn.State == ConnectionState.Open)
                conn.Close();


            string sql = command;
            using (var cmd = new SqlCommand(sql, conn))
            {
                conn.Open();
                foreach (int row in walletList)
                {
                    cmd.Parameters.AddWithValue("@par1", row.ToString());
                    cmd.ExecuteNonQuery();
                    cmd.Parameters.Clear();
                }
                conn.Close();
            }
        }
    }
    catch (Exception ex)
    {
        return ex;
    }
    return null;
}

但是,如果我更改方法以在返回值和InvalidOperationException上声明相等,则此测试失败,并且得到以下消息:

消息:Assert.AreEqual失败。 Expected:System.InvalidOperationException:由于对象的当前状态,操作无效。 Actual:System.InvalidOperationException:ExecuteNonQuery:CommandText属性尚未初始化

我还将代码复制到一个单独的项目文件中,以确保所调用的方法返回InvalidOperationException,并且确实如此。 我想念什么?

你的方法返回一个例外,而不是抛出异常。 ExpectedExceptionAttribute期望您的方法抛出未处理的异常。 这行:

return ex;

返回异常。 相反,只需将其替换为

throw;

或完全删除try / catch,因为除了重新抛出外,仅捕获和执行其他操作与一开始就不捕获相同。

我还要问函数返回Exception是否有意义。

public static Exception ExecuteSQL(List<int> walletList, string command)

那真的是您想要的,还是应该返回执行查询的结果? 该函数应该返回您希望接收的内容,在这种情况下,可能是查询的值或表明已执行的响应。 您不必返回异常。 如果抛出一个,它将自动冒泡至调用方法。 该方法可以处理它,或者如果不能处理,则冒泡到下一个方法,依此类推。


这也解释了如果您将测试更改为断言相等时会遇到的错误。 无论您期望的返回值是什么,都在检查它是否等于Exception

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM