Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ExpectedException未捕获异常,但我可以使用try-catch捕获它_C#_Visual Studio_Unit Testing_Exception - Fatal编程技术网

C# ExpectedException未捕获异常,但我可以使用try-catch捕获它

C# ExpectedException未捕获异常,但我可以使用try-catch捕获它,c#,visual-studio,unit-testing,exception,C#,Visual Studio,Unit Testing,Exception,关于这个有什么想法吗?我正在尝试编写一个单元测试,该测试将删除一个项,并通过尝试按其ID检索该项(该ID应引发DataAccessException)来确认该项不再位于存储库中。然而,测试一直失败。我添加了一个try-catch块,果然捕捉到了预期的异常。我正在使用VS测试工具进行单元测试 [ExpectedException(typeof(DataAccessException))] private static void NHibernateRepositoryBaseDel

关于这个有什么想法吗?我正在尝试编写一个单元测试,该测试将删除一个项,并通过尝试按其ID检索该项(该ID应引发DataAccessException)来确认该项不再位于存储库中。然而,测试一直失败。我添加了一个try-catch块,果然捕捉到了预期的异常。我正在使用VS测试工具进行单元测试

    [ExpectedException(typeof(DataAccessException))]
    private static void NHibernateRepositoryBaseDeleteHelper<T, TKey>(T myItem, TKey myItemId)
    {
        MyTestRepository<T, TKey> myRepository = new MyTestRepository<T, TKey>();
        myRepository.Delete(myItem);
        myRepository.CommitChanges();
        try
        {
            myRepository.GetById(myItemId, false);
        }
        catch (DataAccessException dae)
        {
            Assert.IsTrue(true);
        }
    }
[ExpectedException(typeof(DataAccessException))]
私有静态void NHibernateRepositoryBaseDeleteHelper(T myItem,TKey myItemId)
{
MyTestRepository myRepository=新建MyTestRepository();
myRepository.Delete(myItem);
myRepository.CommitChanges();
尝试
{
GetById(myItemId,false);
}
捕获(DataAccessException dae)
{
Assert.IsTrue(真);
}
}

您需要将ExpectedException属性添加到具有TestMethod属性的相同方法中。VS单元测试框架将只在特定测试的入口点查找ExpectedException属性

[TestMethod]
[ExpectedException(typeof(DataAccessException))]
public void ATestMethod() {
  ...
  NHibernateRepositoryBaseDeleteHelper(itemValue, keyValue);
}

首先,您正在使用delete方法。我将有一个单独的删除方法和测试方法。是的,您正在测试删除,但实际上您正在测试与删除关联的行为。这里可能还有其他测试

由于这是一个自动生成的测试的一部分,我不会在该测试中添加到同一个存储库对象,而是在它们自己的测试方法中执行测试,并将删除作为类设置的一部分。这肯定会将测试与删除分开


希望这能有所帮助。

我会补充Jared的话,指出“ExpectedException”属性很糟糕。无法断言异常的消息是正确的(“message”参数的作用与您可能认为的不同),也无法在一个测试中检查多个异常

更好的解决方案是这样做:

这门课让你可以做一些整洁的事情,比如:

[TestMethod] public void TestAFewObviousExceptions() { // some setup here ExceptionAssert.Throws("Category 47 does not exist", () => wallet.Categories.GetChildCategoryIds(47)); ExceptionAssert.Throws("Id Flim is not valid", () => wallet.Categories.IdFromName("Flim")); } [测试方法] 公共无效TestAfowViousExceptions() { //这里有一些设置 异常assert.Throws(“类别47不存在”,()=> 钱包。类别。GetChildCategoryId(47)); ExceptionAssert.Throws(“Id Flim无效”,()=> 钱包。类别。IdFromName(“Flim”); }
必须给你一个+1的链接。:)只是好奇,你是否需要在博客文章中编辑或添加ExceptionAssert类?我最初在回答中写道“我基于该代码编写了自己的exception类”,但现在我将我使用的函数与该网站上的函数进行了比较,看起来我所做的只是逐字逐句地将其粘贴到我自己的命名空间中。:-)