Visual Studio与xUnit,Assert.Throws和“用户代码未处理异常”

5
我尝试在一个dll应用程序(VS2010/C#)中使用xUnit 1.8.0.1549运行测试。为了做到这一点,我通过项目属性下的"Start External Program" 下的 "Start Action"来运行xUnit, 并通过GUI runner(C:\mypath\xunit.gui.clr4.x86.exe)来运行dll。
我想测试某些方法是否会引发异常,为此,我使用类似以下内容的代码:
Assert.Throws<Exception>(
   delegate
   {
       //my method to test...
       string tmp = p.TotalPayload;
   }
);

问题在于,当抛出“用户代码未处理异常”的异常时,调试器会在我的方法内部停止。这很糟糕,因为它一直停在 GUI 运行器上,让我不得不按 F5 继续运行测试。 我希望能顺利地运行测试,请问应该怎么做? 谢谢。
3个回答

0

如果您进入Visual Studio选项并取消“仅我的代码”设置,xUnit框架将被视为用户代码,并且那些异常(xUnit期望的)不会提示您。

我不知道有任何方法可以针对每个程序集控制此行为(只考虑xUnit作为用户代码,而不是其他外部代码)。


0

-1

当您检查异常是否发生时,您将不得不在单元测试代码中处理异常。目前,您还没有这样做。

以下是一个示例: 我有一个方法,它读取文件名并进行一些处理:

  public void ReadCurveFile(string curveFileName)
    {           
        if (curveFileName == null) //is null
            throw new ArgumentNullException(nameof(curveFileName)); 
        if (!File.Exists(curveFileName))//doesn't exists
            throw new ArgumentException("{0} Does'nt exists", curveFileName);     

...等等 现在我编写一个测试方法来测试这段代码,就像这样:

    [Fact]
    public void TestReadCurveFile()
    {
        MyClass tbGenTest = new MyClass ();

        try
        {
            tbGenTest.ReadCurveFile(null);
        }
        catch (Exception ex)
        {
            Assert.True(ex is ArgumentNullException);
        }
        try
        {
            tbGenTest.ReadCurveFile(@"TestData\PCMTestFile2.csv");
        }
        catch (Exception ex)
        {
            Assert.True(ex is ArgumentException);
        }

现在你的测试应该通过了!


我最初点赞是因为我喜欢这种惯用的方法,这使我能够编写测试来检查异常消息 - 这确保我捕获了我认为要捕获的异常实例,而不是来自调用链深处的另一个具有相同类型的异常... 当我意识到如果调用生成异常,这实际上会通过测试时,我就取消了点赞。 - mindplay.dk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接