MSTest 是否可以忽略嵌套异常并仅针对最后一个进行测试?

Can MSTest ignore the nested exceptions and only test against the last?

假设您有一个函数可以检查提供的字符串值是否为空,如下所示:

string IsNotEmpty(string value)
{
    if (!string.IsEmpty(value)) return value
    else throw new Exception("Value is empty");
}

还假设我们的代码中有许多其他部分调用此通用函数来检查是否存在值,如果没有则抛出比通用函数更具体的异常。作为示例,我将提供以下代码:

string CheckEmail(string email)
{
    try
    {
        return IsNotEmpty(email);
    }
    catch(Exception ex)
    {
        throw new **EmptyEmailException**("Please provide your email");
    }
}

现在我想为 CheckEmail 函数编写一个 MSTest,它期望抛出 EmptyEmailException 类型的异常。但不幸的是,该测试仅捕获来自 IsNotEmpty 函数的通用 Exception,它停止执行并且代码从不测试第二个异常。

我做过但没有成功的事情:

  1. 我用 ExpectedException 属性编写了我的测试。
  2. 我写了我的测试 Assert.ThrowsException。
  3. 我更新了 VS 中的异常设置 不要阻止异常类型的异常,只是看看是否 将解决我的问题。

无论我做什么,MSTest 总是报告第一个异常,当然我的测试失败了。下面是我目前的测试代码:

[TestMethod]
public void When_Validating_SignInRequest_And_Email_IsEmpty_Raise_EmptyEmailException()
{
    var ex = Assert.ThrowsException<EmptyEmailException>(
                () => CheckEmail(string.Empty)
            );
}

谁能给我指出正确的方向?

谢谢。

这对我来说很好用:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace MyNamespace
{
    public class EmptyEmailException : Exception
    {
        public EmptyEmailException(string message) : base(message)
        { }
    }

    public class MyClass
    {
        public static string IsNotEmpty(string value)
        {
            if (!string.IsNullOrEmpty(value))
                return value;
            else
                throw new Exception("Value is empty");
        }

        public static string CheckEmail(string email)
        {
            try
            {
                return IsNotEmpty(email);
            }
            catch
            {
                throw new EmptyEmailException("Please provide your email");
            }
        }
    }

    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            Assert.ThrowsException<EmptyEmailException>(() => MyClass.CheckEmail(string.Empty));
        }
    }
}