C# 如何断言已引发异常

C# 如何断言已引发异常,c#,unit-testing,moq,mstest,C#,Unit Testing,Moq,Mstest,我正在使用MOQ设置一个方法来抛出一个InvalidOperationException。然后我使用MSTestAssert.ThrowsException断言该方法抛出指定的异常。当我调试测试时,它抛出异常,而不是断言预期的异常已经抛出 我搜索了这个,没有找到与我的问题相关的例子。我在方法[ExpectedException(typeof(InvalidOperationException))]中添加了一个属性,但得到了相同的结果。我尝试将引发异常的代码移到断言之外,并移到它自己的代码行中,但

我正在使用MOQ设置一个方法来抛出一个
InvalidOperationException
。然后我使用MSTest
Assert.ThrowsException
断言该方法抛出指定的异常。当我调试测试时,它抛出异常,而不是断言预期的异常已经抛出

我搜索了这个,没有找到与我的问题相关的例子。我在方法
[ExpectedException(typeof(InvalidOperationException))]
中添加了一个属性,但得到了相同的结果。我尝试将引发异常的代码移到断言之外,并移到它自己的代码行中,但得到了相同的结果。我没有尝试将代码包装到自己的方法中,该方法从测试方法调用,因为我不知道如何将模拟对象作为参数传递到新方法中(我将使用什么类型?编译器不喜欢Moq或Moq)

[TestClass]
公共类UnitTest1
{
[预期异常(类型(无效操作异常))]
[测试方法]
公共void TestMethod1()
{
var mock=new mock();
//使用特定参数调用时引发
mock.Setup(foo=>
foo.DoSomething(“重置”)).Throws();
//模拟对象剂量测量(“重置”);
Assert.ThrowsException(()=>
模拟。对象。剂量测量(“重置”);
}
}


感谢Kenneth K帮助我发现错误。根据我所看到的,我相信当您的意图是断言抛出了异常时,通过单元测试进行调试是不可能的。但是您可以运行测试并断言已引发异常。要使用MSTest正确设置测试以断言异常,请使用ExpectedExceptions属性。虽然我假设在本单元测试中可以使用Assert.ThrowsException,但我无法使该方法起作用。

感谢Kenneth K帮助我看到错误。根据我所看到的,我相信当您的意图是断言抛出了异常时,通过单元测试进行调试是不可能的。但是您可以运行测试并断言已引发异常。要使用MSTest正确设置测试以断言异常,请使用ExpectedExceptions属性。虽然我假设在这个单元测试中可以使用Assert.ThrowsException,但我无法使这种方法起作用。

为什么要同时使用
ExpectedException
Assert.ThrowsException
?挑一个或另一个。后者将在失败时抛出一个
AssertFailedException
,该异常无论如何与
ExpectedException
不匹配;但是,由于您的
Assert
确实为true(基于您的模拟),因此您的Assert不会失败,这意味着它不会抛出
assertfailedeexception
。此外,它是否真的抛出了
invalidoOperationException
?也许这已经被处理了,但也抛出了一些其他异常?在编辑之后,您在测试资源管理器中看到了什么?屏幕上是绿色还是红色?无论哪种情况,您都应该看到绿色。为什么同时使用
ExpectedException
Assert.ThrowException
?挑一个或另一个。后者将在失败时抛出一个
AssertFailedException
,该异常无论如何与
ExpectedException
不匹配;但是,由于您的
Assert
确实为true(基于您的模拟),因此您的Assert不会失败,这意味着它不会抛出
assertfailedeexception
。此外,它是否真的抛出了
invalidoOperationException
?也许这已经被处理了,但也抛出了一些其他异常?在编辑之后,您在测试资源管理器中看到了什么?屏幕上是绿色还是红色?无论哪种情况,您都应该看到绿色。您可以调试测试。您只需要查看测试资源管理器。查找异常的测试的全部要点就是该异常的发生。如果您在调试器中运行,那么当引发异常时,您仍然会获得正常的调试行为。您关心的是看到最终结果(绿色或红色)。您可以调试测试。您只需要查看测试资源管理器。查找异常的测试的全部要点就是该异常的发生。如果您在调试器中运行,那么当引发异常时,您仍然会获得正常的调试行为。你关心的是看到最终结果(绿色或红色)。
[TestClass]
public class UnitTest1
{
    [ExpectedException(typeof(InvalidOperationException))]
    [TestMethod]
    public void TestMethod1()
    {
        var mock = new Mock<IFoo>();

        // throwing when invoked with specific parameters
        mock.Setup(foo => 
             foo.DoSomething("reset")).Throws<InvalidOperationException>();
        //mock.Object.DoSomething("reset");
        Assert.ThrowsException<InvalidOperationException>(() => 
             mock.Object.DoSomething("reset"));
    }
}