ExpectedException没有捕获异常,但我可以用try catch捕获它

时间:2009-03-12 18:07:09

标签: c# visual-studio unit-testing exception

关于这个的任何想法?我正在尝试编写一个单元测试,它将删除一个项目并通过尝试通过其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);
        }
    }

3 个答案:

答案 0 :(得分:5)

我将通过指出“ExpectedException”属性很糟糕来补充Jared所说的内容。没有办法断言异常的消息是正确的(“消息”参数没有做你想象的那样)并且你不能在一次测试中检查多个异常。

更好的解决方案是做这样的事情: http://geekswithblogs.net/sdorman/archive/2009/01/17/unit-testing-and-expected-exceptions.aspx

该课程可以让你做这样的好事:

[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"));
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:0)

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

由于这是自动生成测试的一部分,我不会在该测试中添加相同的存储库对象,但会在自己的测试方法中执行我的测试,并使用delete作为为班级设置。这肯定会将测试与删除分开。

希望这有帮助。