C# MSTest单元测试断言特定异常消息

C# MSTest单元测试断言特定异常消息,c#,unit-testing,exception,mstest,argumentnullexception,C#,Unit Testing,Exception,Mstest,Argumentnullexception,我正在为一个非常小的项目编写我的第一个单元测试。这里,预期结果和结果都返回ArgumentNullException,但测试仍然失败。知道为什么吗 [TestMethod] public void InsertFileBeginning_FilePathNull_ReturnArgumentNullException() { // Arrange var generateFile = new Gene

我正在为一个非常小的项目编写我的第一个单元测试。这里,预期结果和结果都返回ArgumentNullException,但测试仍然失败。知道为什么吗

        [TestMethod]
        public void InsertFileBeginning_FilePathNull_ReturnArgumentNullException()
        {
            // Arrange
            var generateFile = new GenerateFile();
            string parameter = null; //pass FilePath Null

            var expectedExcetpion = new ArgumentNullException();

            // Act & Assert
            var result = Assert.ThrowsException<ArgumentNullException>(() => generateFile.InsertFileBeginning(parameter));
            Assert.AreEqual(expectedExcetpion, result);

        }
错误:

应为:System.ArgumentNullException:值不能为null

实际值:System.ArgumentNullException:路径不能为空。参数名称:路径

Message: Assert.AreEqual failed. Expected:<System.ArgumentNullException: Value cannot be null.>. Actual:<System.ArgumentNullException: Path cannot be null.
Parameter name: path
   at SmartTestSelecter.GenerateFile.InsertFileBeginning(String filePath) in C:\Users\CC\SmartTestSelecter\GenerateFile.cs:line 31
   at SmartTestSelecterUnitTests.GenerateFileTest.<>c__DisplayClass0_0.<InsertFileBeginning_FilePathNull_ReturnArgumentNullException>b__0() in C:\Users\CC\STSUnitTests\GenerateFileTest.cs:line 21
   at Microsoft.VisualStudio.TestTools.UnitTesting.Assert.ThrowsException[T](Action action, String message, Object[] parameters)>. 
消息:Assert.AreEqual失败。预期:。实际值:。

首先,不要使用
[ExpectedException]
。事实证明,这是一种糟糕的做法,因为异常可能发生在任何地方。由于您使用的是Assert.ThrowsException,它不会进一步抛出异常,因此您的测试无论如何都会失败

其次,关于MSTest,我不是很了解最新情况,但是如果没有使用默认消息引发异常,那么它似乎会失败。但是,如果无法在
Assert.ThrowsException
中指定预期的错误消息,则可以实现自己的Assert方法:

publicstaticvoid抛出(Action-Action,字符串expectedMessageContent=null)
其中T:异常
{
尝试
{
action.Invoke();
}
捕获(例外e)
{
Assert.IsInstanceOf(typeof(T),e);
Assert.IsTrue(expectedMessageContent==null
||包含(expectedMessageContent),$“预期消息:{expectedMessageContent}{Environment.NewLine}实际消息:{e.Message}”);
返回;
}
Assert.Fail(“未引发异常”);
}
免责声明:我不知道MSTest是否有Assert.IsInstanceOf等方法,但你明白了重点。

看看这个

var expectedExcetpion = new ArgumentNullException();
// Act & Assert
var result = Assert.ThrowsException<ArgumentNullException>(() => generateFile.InsertFileBeginning(parameter));
Assert.AreEqual(expectedExcetpion, result);

请同时分享
insertfilebeging
方法的外观。请看一下这个线程,它可能会对您的案例有所帮助@PavelAnikhouski非常感谢。是的,这个解决方法确实可以比较参数名称。这正是问题所在。非常感谢。现在只有我知道我的编码出了什么问题。谢谢大家的时间和帮助。
var expectedExcetpion = new ArgumentNullException();
// Act & Assert
var result = Assert.ThrowsException<ArgumentNullException>(() => generateFile.InsertFileBeginning(parameter));
Assert.AreEqual(expectedExcetpion, result);
Assert.IsInstanceOfType(result, typeof(ArgumentNullException));